2012-03-02 15 views
0

自分のプロフィールに「新しい属性を追加する」機能を実装したいと思います。教育は、細部のラベルで、卒詳細ですどうすればこの関連付けを実装できますか?

Education : Degree 

:ここで彼は細部のためのラベルなど、実際の詳細を作成することができるはずです。

また、この詳細を表示するか非表示にするかを決定するオプションも必要です。

どのように私は協会

User has_one Profileで新しいモデルプロファイルを使用してこれを実装することができます。

新しい詳細のラベルとテキストがあれば、ハッシュを試してみたかもしれませんが、ユーザーが詳細をhiddenまたはvisibleにしたいかどうかについてユーザーから詳細を得なければならないので、その値を格納するために余分なフィールドが必要になる場合があります(trueまたはfalse)。それでどのように実装できますか?

私は必要なものがhas_one関連であるため、has_many Profile user_id:integer name:string content:string visible:booleanを作成できません。

私は本当に一緒に実装されているすべてのものを得る方法については本当に混乱しています。

私はこれをどのように実装できるのか、ユーザーがdbのschemaを変更せずに新しい詳細を作成するたびにモデルを更新する方法を教えてください。

私はRails 3.2に取り組んでいます。

+0

「dbのスキーマを変更することなく」、どのスキーマをお持ちですか? db内の各属性のラベルと詳細を格納する方法が必要です。 – alf

+0

@alfonso:キー値のペアとブール値をシリアル化する必要があるかもしれません。どうすればいい? –

+0

です。プロファイルテーブルには1つのフィールドしかなく、そのフィールドにすべての属性をシリアル化する必要がありますか?それはおそらく良い選択ではありません。 ProfileAttributesテーブルとモデルを持つ方が良いかもしれません。 – alf

答えて

3

のようなものを置きますモデル内のメソッドをシリアライズする:

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

これは、このようなコードを書くことができます:

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

ハッシュはYAMLフォーマットで直列化されます。


編集:CRUD操作

が教育を追加または変更するには:

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} 

教育を削除するには:

profile.attributes.delete :education 
+0

ありがとう...しかし、私の要件によると、私のモデル名はProfileであり、キー値のペアとそれに対応するブール値(可視/非表示)が必要です。どのように私はハッシュブールのペアを特に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 

プロフィールテーブルにtext型の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

私はちょうど1つのモデルのプロファイルを持ち、各キーと値のペアに対応するキー値ペアとブール値をCRUDするためにシリアライズする必要があります。どうやってやるの ? –

関連する問題