2012-03-24 15 views
0

私は次の団体や私のオブザーバーでのアクションがあります。別のモデルの属性を正しくコピーできません。

class Product < ActiveRecord::Base 
    attr_accessible :price, :name, :watch_price 
    belongs_to :user 
    belongs_to :store 
    has_many :product_subscriptions, :dependent => :destroy 
    has_many :product_subscribers, :through => :product_subscriptions, :class_name => 'User' 
end 

class ProductSubscription < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :product_subscriber, :class_name => 'User' 
    attr_accessible :watched_price, :watched_name 
end 

class ProductObserver < ActiveRecord::Observer 
def after_create(product) 
    ProductSubscription.new(product.attributes.merge({ 
     :watched_name => name, 
     :watched_price => price, 
     :store_id => :store_id, 
     })) 
    end 
end 

上記のコードは、成功しuser_idproduct_idが、:watched_name:watched_priceProduct:price:nameで満たされていないとProductSubscriptionを作成します。

私は問題がこれにあることに気付きました。

WARNING: Can't mass-assign protected attributes: product_id 

今、私は離れてのではないProductモデルで離れている他のフィールドを持っています:私は、データベースに見たとき、私は上記のように、それが割り当てられているため何の意味も持ちませんProductSubscriptionモデルなので、そんなことが起こったのだろうか?

私はproduct_idを大量割り当て可能にしたくありません。どうすればこの問題を修正できますか?

+0

なぜProductSubscriptionに最初にProductの属性の重複があるのですか? –

+0

@AndrewMarshall私はProductSubscriptionを使用して、最初に製品の属性をコピーし、次にコピーされた属性を他の同様の製品と比較することにより、より安い価格で「監視」します。 – LearningRoR

答えて

2

ハッシュ値は、属性メソッドを参照する必要がありますが、一部の記号は参照する必要がありません。こうすると、それぞれの属性値を返すメソッドが呼び出され、その値がハッシュに挿入されます。あなたが使った記号は意味が全くありません。

ProductSubscription.new(product.attributes.merge({ 
    :watched_name => name, 
    :watched_price => price, 
    :store_id => store_id, 
    })) 
end 

また、新しいProductSubscriptionを保存していないようです。 newを呼び出すだけでは、オブジェクトがデータベースに保持されません。代わりにcreateのようなものを使用してください。

最後に、Andrew Marshall氏によると、データベース設計は実際には最適ではありません。テーブルの行全体をコピーすることは、優れたパフォーマンスを提供することはありません。代わりに、間もなく不一致と、コピーされたすべてのデータを最新に保つという面倒さに苦しんでいます。あなたは本当にジョインとコンセプトについて学ぶべきですDatabase normalization

関連する問題