如何自动为产品分配最新的地点税?

时间:2012-08-29 11:43:45

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

我有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>

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

2 个答案:

答案 0 :(得分:3)

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

以下内容应该有效:

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

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

答案 1 :(得分: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