0

Rails 3.1、Ruby 1.9.2

Railscastsエピソード345(HSTORE)を構築中のアプリケーションに適合させようとしています-この問題はHSTORE中心ではありません...プロパティハッシュをシリアル化した場合にも発生するためです。

これが私が質問しているコードです:

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という名前の結合されたhas_manyモデルを検索し、配列にプロパティIDのコレクションを入力させたいと思います。

%w[作成者評価ランタイム]の宣言された配列を次のように置き換えてみました

self.properties.collect{ |property| "property_#{property.id}" }.each do |key|

しかし、それは機能しません!! プロパティの関係で未定義のメソッドエラーが発生します(モデルがまだインスタンス化されていないためだと思いますか?)私はプログラミングにかなり慣れておらず、メタプログラミングについて何も知りません。

編集-私はこれをすべてafter_findフックに移動しようとしましたが、これも機能しません(他の何十もの失敗した試みと一緒に)。

どんな助けでも大歓迎です!

4

1 に答える 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を構築し、クラスのインスタンスごとにカスタムを作成しました(または、そう思いますか?!)

これが誰かに役立つことを願っています!次に、複数のデータベース書き込みとシリアル化および1回の書き込みのパフォーマンスのトレードオフを確認します。

于 2012-05-14T18:49:09.437 に答える