编辑Parent后,更新与父列属性的关联?

时间:2012-04-08 17:56:00

标签: ruby-on-rails ruby ruby-on-rails-3

我无法订阅我的产品更新,并且还将产品的属性复制到与我的订阅表相同的字段。

我的关联是,subscriptionsproducts属于User,但Productsubscriptions

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

然后ProductSubscription表格与我要复制的列相同:

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的假设是:

  1. 检查是否存在特定产品的订阅以及是否存在....
  2. 使用产品新修改的属性更新当前用户订阅。
  3. 目前,订阅产品在产品发布时不会更新。我需要解决这个代码才能让它做到这一点?将产品字段复制到订阅时会怎样?

2 个答案:

答案 0 :(得分:1)

不确定这只是一个错字,但你的观察者是错的。 self不是观察者的产物。相反,您应该使用product(给定参数)。

其次,您对订阅的查找似乎也是错误的。您使用的是未定义的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

希望这有帮助。

答案 1 :(得分:0)

尝试将:autosave => true传入您的关联选项。

您可以详细了解here