2012-04-08 9 views
0

私の製品で私のサブスクリプションを更新することはできません。また、製品の属性をサブスクリプションテーブルと同じフィールドに複製することもできません。親を編集した後、親カラムの属性との関連付けを更新しますか?

私の団体があり、subscriptionsproductsUserに属しているが、Productは、多くのsubscriptionsを持っています。

Subscription.rb

class Subscription 
    belongs_to :subscriber, :class_name => "User" 
    belongs_to :subscribable, :polymorphic => true 
end 

Product.rb

class Product 
    belongs_to :user 
    has_many :subscriptions, :as => :subscribable, :dependent => :destroy 
end 

User.rb

class User 
    has_many :products, :dependent => :destroy 
    has_many :subscriptions, :foreign_key => :subscriber_id, :dependent => :destroy 
end 

そして私は複製しようとしている同じ列を持つとSubscriptionテーブル:

create_table :products do |t| 
    t.string :name 
    t.decimal :price 
    t.integer :user_id 
end 

create_table :subscriptions do |t| 
    t.string :name 
    t.decimal :price 
    t.integer :subscriber_id # same as user_id 
    t.integer :subscribable_id 
    t.string :subscribable_type 
end 

ProductsController

def edit 
    @product = Product.find(params[:id]) 
end 

def update 
    @product = Product.find(params[:id]) 
    if @product.update_attributes(params[:product]) 
     redirect_to(@product, :notice => 'Successfully Updated.') 
    else 
     render :back 
    end 
end 

ProductObserver after_updateが行うことに仮定される何

class ProductObserver < ActiveRecord::Observer 
    def after_update(product) 
    if self.subscriptions.find_by_subscribable_id_and_subscribable_type(subscribable_id, subscribable_type) 
     subscription = Subscription.find_by_subscribable_id_and_subscribable_type(subscribable_id, subscribable_type) 
     self.subscription.update_attributes(params[:subscription]).select{ |key, _| Subscription.attribute_names.include? key }) 
    end 
    end 
end 

is:

  1. チェックは、特定の製品のサブスクリプションが存在する場合、それがない場合は....
  2. 更新現在のユーザーは、製品の新しい編集した属性とサブスクリプション。

現時点では、サブスクリプションは更新されません。これを行うためにこのコードについて修正する必要があるのは何ですか?プロダクトフィールドをサブスクリプションに複製するとどうなりますか?

答えて

1

これはちょうどタイプミスでしたが、あなたのオブザーバーが間違っているかどうかは不明です。 selfは、オブザーバーの製品ではありません。代わりにproduct(指定されたパラメータ)を使用する必要があります。

第2に、購読の検索も間違っているようです。 subscribable_idsubscribable_typeが定義されていないため、nilのみを使用しています。私はproduct.id'Product'を使いたいと思っていますが、製品のすべてのサブスクリプションを繰り返すことができます。 product.subscriptionsはすべてsubscriptionsをその製品にリンクして返します。

最後に、あなたがリンクされ、製品と常に同期サブスクリプションのpricenameを維持しようとしているならば、なぜ代わりにこのような何かをしないでください。

create_table :products do |t| 
    t.string :name 
    t.decimal :price 
    t.integer :user_id 
end 

create_table :subscriptions do |t| 
    t.integer :subscriber_id # same as user_id 
    t.integer :subscribable_id 
    t.string :subscribable_type 
end 

とサブスクリプションモデルの内側には

を行います
class Subscription 
    belongs_to :subscriber, :class_name => "User" 
    belongs_to :subscribable, :polymorphic => true 

    delegate :name, :price, :to => :subscribable, :allow_nil => true 
end 

これは役立ちます。

0

あなたの関連オプションに:autosave => trueを渡してみてください。

詳しくはhereをご覧ください。

+0

私は 'Product'モデルにそれを入れても何も起こりませんでした。 'has_manyサブスクリプション、:autosave => true' – LearningRoR

関連する問題