2012-05-10 2 views
0

の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フックにこのすべてを移動しようとしました、これはどちらか動作しませんので、紛失...

すべてのヘルプは大であります感謝!

+0

メソッドのプロパティは、製品のインスタンスでのみ使用できます。 @ product.propertiesのセマンティクスを完全に置き換えたいですか? (has_many:propertiesを削除する)、あるいは通常のセマンティクスを保持して何らかの方法で補完したいと思っていますか? – RadBrad

+0

返信いただきありがとうございます - 私は(まだ私は@ product.propertiesを照会できるようにしたいので)通常のセマンティクスを維持したいですが、それらに追加します。たとえば、製品1にプロパティーの作成者と評価が割り当てられている場合は、ランタイム属性をこのインスタンスのアクセス可能な属性リストから除外します。一方、製品が結合によって割り当てられたすべてのプロパティを持っている場合は、すべてのプロパティをアクセス可能として利用できるようにしたいと思います。 –

答えて

0

ハッキングの数日後、私は最終的にこれを理解したと思います。

どのように「サウンド」がどのようにこのソリューションであるすべてのピニオンは大いに感謝!要するに

は、私は上記のコードブロックをラップであったすべてがそうような方法に(%記号で始まる):

def dynamic_accessible_and_setters(*details) 
    details.each do |key| # I placed the details variable here instead of the %w[] 
    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 
end 

を次に、コントローラに、私はちょうどからメソッドを呼び出しクラスと割り当てられた属性の配列:

def edit 
    PRODUCT.dynamic_accessible_and_setters("author", "rating", "runtime") 
    ... 
end 

そして今、私は動的に構築されているゲッター、セッターとattr_accessible、クラスのインスタンスごとにカスタム(または、そう、私は!?と思う)

私はこれが誰かを助けることを願っています!今度は、複数のDB書き込みと、直列化と1回の書き込みのパフォーマンスのトレードオフを確認してください。

関連する問題