2012-01-18 9 views
0

私は仮想属性を取得して設定するメソッドを持っています。実は彼らは説明する必要があり、このコードスニペットとして、実際の属性に1つの文字を設定します。define_methodの仮想属性は、レールのメソッドを生成しました。

attr_accessible :picnic_on_sunday, :picnic_on_monday, :picnic_on_tuesday, 
       :picnic_on_wednesday, :picnic_on_thursday, :picnic_on_friday, 
       :picnic_on_saturday, 

['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 
    'friday', 'saturday'].each_with_index do |dayname, dayindex| 
    define_method "picnic_on_#{dayname.downcase}".to_sym do 
    picnic_weekdays[dayindex]=='1' 
    end 
    define_method "picnic_on_#{dayname.downcase}=" do |value| 
    wdays = picnic_weekdays 
    wdays[dayindex] = (value==true or value=='1') ? '1':'0' 
    self.picnic_weekdays = wdays 
    end 
end 

picnic_weekdaysは、スキームに存在する本当の属性です。私の問題は、x.picnic_on_monday = truex.picnic_weekdaysのインデックス1を変更したときに、生成されたgetters/setterが動作するにもかかわらず、saveをモデルに呼び出すと何も保存されないということです。この動作は、メソッドがdefine_methodによって生成された場合にのみ発生します。それはなぜそうですか?生成された仮想属性を動作させるにはどうすればよいですか?あなたの説明をありがとう。

+0

それはattr_accessibleを追加しようとする価値があるかもしれない:picnic_weekdaysあなたがいない場合既に。 – miked

+0

はい、私はすでに同じ結果を試しています。私は実際には別の方法で問題を解決しましたが、私が期待するようにこの構造がうまくいかない理由はまだ私には興味があります。 – fifigyuri

+0

ビットフィールドを実装していますが、コードにはいくつかの概念的なエラーがあります。私は個人的にこれを自分ではしませんが、プラグインを使用します。 https://github.com/xing/flag_shih_tzuはあなたの望むものとまったく同じです。それはよくテストされ、よく管理されています。 –

答えて

1

picnic_weekdaysへの変更は、変更された属性を追跡するActiveRecordの内部ロジックを無効にしたように見えるため、永続的ではありません。私の推測では、DirtyモジュールがActiveRecordにパッチされているためです。あなたの質問で

例は次のように属性が<attribute>_will_change!メソッドを使用して、変更されたことのActiveRecordを伝えることにより固定することができます。

define_method "picnic_on_#{dayname.downcase}=" do |value| 
    wdays = picnic_weekdays 
    wdays[dayindex] = (value==true or value=='1') ? '1':'0' 
    self.picnic_weekdays = wdays 
    self.picnic_weekdays_will_change! 
end 
+0

大きな説明、試してみる価値があり、答えのように聞こえます。ありがとうございました! – fifigyuri

関連する問題