0

사용자가 자신의 프로파일에 "새로운 속성을 추가"할 수있는 기능을 구현하고 싶습니다. 교육 세부 사항에 대한 레이블과 학위가 세부 사항입니다어떻게이 연결을 구현할 수 있습니까?

Education : Degree 

: 여기에서 그는 세부의 레이블과 같은 실제 세부 사항을 만들 수 있어야합니다.

이 외에도이 세부 정보를 표시할지 숨길 지 결정해야합니다. 나는 협회

User has_one Profile와 함께 새로운 모델 프로필을 사용하여이를 구현할 수있는 방법

. 난, 난 그냥 새로운 자세한 내용은 라벨과 텍스트를 가지고 있다면

, 나는 해시를 시도 할 수 있지만 나는 또한 사용자가 세부 사항을 원하는지에 사용자로부터 정보를 얻을 수있을 것이기 때문 visiblehidden 만든 또는 수 해당 값을 저장하기 위해 추가 필드가 필요할 수도 있습니다 (true 또는 false). 어떻게 구현할 수 있습니까?

내가 필요한 것은 has_one 연관이므로 has_many Profile user_id:integer name:string content:string visible:boolean을 만들 수 없습니다.

나는 모든 것을 함께 구현할 수있는 방법에 대해 정말로 혼란 스럽다.

구현 방법을 제안하고 사용자가 db의 schema을 변경하지 않고 새 세부 정보를 만들 때마다 모델을 업데이트하는 방법을 알려주십시오.

레일즈 3.2를 연구 중입니다.

+0

"db 스키마 변경없이"어떤 스키마가 있습니까? DB의 각 속성에 대한 레이블과 세부 정보를 저장하는 방법이 필요합니다. – alf

+0

@alfonso : 키 값 쌍과 부울을 직렬화해야 할 수도 있습니다. 내가 어떻게 할 수 있니? –

+0

그래서 프로필 테이블에 필드가 하나만 있으므로 모든 속성을 해당 필드에 serialize해야합니까? 그것은 아마도 좋은 선택이 아닙니다. ProfileAttributes 테이블과 모델을 갖는 것이 더 나을 수도 있습니다. – alf

답변

3

같은 것을 넣어 것 모델에서 메소드 직렬화 :

class Profile < ActiveRecord::Base 
    serialize :attributes, Hash 
end 

이이 같은 코드를 작성 할 수 있습니다 :

profile.attributes = { :education => ["Chef degree", true], :hobby => ["Cook", false] } 
profile.save 

해쉬는 YAML 형식으로 직렬화됩니다.

profile.attributes[:education] = ["Another title", true] # the boolean here represents the visibility 

모든 눈에 보이는 속성을 쿼리하려면 :

profile.attributes.each{|key, value| print "#{key.to_s.capitalize} : #{value.first}" if value.second} 

이 교육을 삭제하려면


편집 : 추가하거나 교육을 수정하려면 CRUD 작업

:

profile.attributes.delete :education 
+0

고마워요 ...하지만 내 요구 사항에 따르면, 내 모델 이름은 프로필이며 키 값 쌍과 이에 상응하는 부울 (가시/숨김)을 가져야합니다. 어떻게 해시 부울 쌍을 특히 CRUD 할 수 있습니까? 즉, 키, 값 및 부울과 같은 새로운 속성을 만듭니다. –

+0

@MithunSasidharan CRUD 작업을 표시하기 위해 대답을 편집했습니다. – alf

+0

감사합니다. 이게 효과가있는 것 같아 !! –

1

중첩 된 특성을 통해 만들 것입니다.

class User < ActiveRecord::Base 
    has_one :profile 
    accepts_nested_attributes_for :profile 
end 

class Profile < ActiveRecord::Base 
    has_many :fields 
    accepts_nested_attributes_for :fields 
end 

은보기에, 나는 당신이 사용할 수 있습니다 당신은

class AddAttributesToProfile < ActiveRecord::Migration 
    def self.up 
    add_column :profiles, :attributes, :text 
    end 

    def self.down 
    remove_column :profiles, :attributes 
    end 
end 

그런 다음 프로파일 테이블에 텍스트를 입력의 attributes라는 이름의 열이 가정이

= form_for user do |f| 
    = f.fields_for :profile do |p_form| 
    = p_form.fields_for :fields do |f_form| 
     = f_form :name 
     = f_form :value 
+0

나는 단 하나의 모델 프로필을 갖고 싶어하고 각 키 - 값 쌍에 대응하는 키 값 쌍과 부울을 CRUD하기 위해 serialize를 사용한다. 어떻게해야합니까? –

관련 문제