私は仮想属性を取得して設定するメソッドを持っています。実は彼らは説明する必要があり、このコードスニペットとして、実際の属性に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 = true
がx.picnic_weekdays
のインデックス1を変更したときに、生成されたgetters/setterが動作するにもかかわらず、save
をモデルに呼び出すと何も保存されないということです。この動作は、メソッドがdefine_method
によって生成された場合にのみ発生します。それはなぜそうですか?生成された仮想属性を動作させるにはどうすればよいですか?あなたの説明をありがとう。
それはattr_accessibleを追加しようとする価値があるかもしれない:picnic_weekdaysあなたがいない場合既に。 – miked
はい、私はすでに同じ結果を試しています。私は実際には別の方法で問題を解決しましたが、私が期待するようにこの構造がうまくいかない理由はまだ私には興味があります。 – fifigyuri
ビットフィールドを実装していますが、コードにはいくつかの概念的なエラーがあります。私は個人的にこれを自分ではしませんが、プラグインを使用します。 https://github.com/xing/flag_shih_tzuはあなたの望むものとまったく同じです。それはよくテストされ、よく管理されています。 –