のRails 3.1、Rubyの1.9.2ルビー - >メタプログラミング - にhas_manyの関係に基づいてattr_accessible属性の動的配列を作成
私が構築していたアプリケーションにRailscastsエピソード345(hstoreのを)適応しようとしています - この問題は、HSTOREの中心ではありません...私がPropertiesハッシュをシリアライズしていた場合、私はその中に入ります。ここでツイストですが、今
Class Product < ActiveRecord::Base
has_many :properties
%w[author rating runtime].each do |key| # *****--> PLEASE SEE BELOW!
attr_accessible key
scope "has_#{key}", lambda { |value| where("properties @> (? => ?)", key, value) }
define_method(key) do
properties && properties[key]
end
define_method("#{key}=") do |value|
self.properties = (properties || {}).merge(key => value)
end
end
*:ここ
は、私が疑問を持っているコードです。製品クラスには、作成時に管理者によって割り当てられる多くのプロパティがあります。これは、Propertyという結合モデルで行われます。プロパティの配列の代わりに、Propertyという結合されたhas_manyモデルを検索し、配列にプロパティIDのコレクションを取り込ませたいと思います。
私は
self.properties.collect{ |property| "property_#{property.id}" }.each do |key|
で[著者評価ランタイム]ワット%の宣言された配列を交換しようとしたが、それは動作しません!私はプロパティの関係に未定義のメソッドエラーを取得します(モデルはまだインスタンス化されていないためです)?私はプログラミングにはまだ新しく、メタプログラミングについては何も知りません。
EDIT - (。他の失敗した試行の数十と一緒に)私はafter_findフックにこのすべてを移動しようとしました、これはどちらか動作しませんので、紛失...
すべてのヘルプは大であります感謝!
メソッドのプロパティは、製品のインスタンスでのみ使用できます。 @ product.propertiesのセマンティクスを完全に置き換えたいですか? (has_many:propertiesを削除する)、あるいは通常のセマンティクスを保持して何らかの方法で補完したいと思っていますか? – RadBrad
返信いただきありがとうございます - 私は(まだ私は@ product.propertiesを照会できるようにしたいので)通常のセマンティクスを維持したいですが、それらに追加します。たとえば、製品1にプロパティーの作成者と評価が割り当てられている場合は、ランタイム属性をこのインスタンスのアクセス可能な属性リストから除外します。一方、製品が結合によって割り当てられたすべてのプロパティを持っている場合は、すべてのプロパティをアクセス可能として利用できるようにしたいと思います。 –