0

我有 3 个模型;产品、税收和地点。每当创建产品时,如果有税,我想分配该位置的最新税。

class Location < ActiveRecord::Base
  belongs_to :user
  has_many :products
  has_many :taxes
end

class Tax < ActiveRecord::Base
  attr_accessible :date # I use this to get the latest tax
  belongs_to :location
  has_many :products
end

class Product < ActiveRecord::Base
  attr_accessible :tax_id
  belongs_to :location
  belongs_to :tax
end

现在我在我的Product模型中尝试了这个:

after_create :assign_latest_location_tax

private

def assign_latest_location_tax
  if self.location.tax.present?
    self.tax_id = self.location.tax.order("date DESC").first.id
  end
end

但这给了我错误:

NoMethodError in ProductsController#create

undefined method `tax' for #<Location:0x4669bf0>

这样做的正确方法是什么?

4

2 回答 2

3

位置 has_many 税,因此它公开访问其税的方法是taxes,而不是tax

以下应该有效:

self.tax_id = self.location.taxes.order("date DESC").first.id

如果您使用after_create回调,则必须在结束时再次调用 save 。为避免这种情况,您可以使用before_create回调。

于 2012-08-29T11:50:40.053 回答
1

此代码应该可以工作:

def assign_latest_location_tax
  if self.location.taxes.count > 0
    self.tax_id = self.location.taxes.order("date DESC").first.id
  end
end
于 2012-08-29T12:04:14.890 回答