我无法订阅我的产品更新,并且还将产品的属性复制到与我的订阅表相同的字段。
我的关联是,subscriptions
和products
属于User
,但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
然后Product
和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
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
after_update
的假设是:
目前,订阅产品在产品发布时不会更新。我需要解决这个代码才能让它做到这一点?将产品字段复制到订阅时会怎样?
答案 0 :(得分:1)
不确定这只是一个错字,但你的观察者是错的。 self
不是观察者的产物。相反,您应该使用product
(给定参数)。
其次,您对订阅的查找似乎也是错误的。您使用的是未定义的subscribable_id
和subscribable_type
,因此仅nil
。我想你想使用product.id
和'Product'
,但是你可以迭代产品的所有订阅。 product.subscriptions
会返回与该产品相关联的所有subscriptions
。
最后,如果您要使订阅的price
和name
始终与关联产品保持同步,那么为什么不这样呢:
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
希望这有帮助。
答案 1 :(得分:0)
尝试将:autosave => true
传入您的关联选项。
您可以详细了解here。