0

我无法使用我的产品更新我的订阅,也无法将产品的属性复制到与我的订阅表相同的字段中。

我的联想是,subscriptions属于products一个User,但一个Product有很多subscriptions

订阅.rb

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

产品.rb

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

用户.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

产品控制器

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

产品观察员

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. 使用产品新编辑的属性更新当前用户订阅。

目前,订阅不会在产品更新时更新。我需要对此代码进行什么修复才能使其执行此操作?将产品字段复制到其订阅时会怎样?

4

2 回答 2

1

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

其次,您对订阅的查找似乎也是错误的。您正在使用subscribable_id并且subscribable_type未定义,因此只是nil. 我认为您想使用product.idand '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

希望这可以帮助。

于 2012-04-11T20:47:47.950 回答
0

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

你可以在这里阅读更多关于它的信息。

于 2012-04-09T05:56:29.237 回答