类之间的链接属性(ruby on rails)

时间:2013-08-22 14:32:37

标签: ruby-on-rails ruby class sum attr

早上好,我在我的rails应用程序中遇到问题时尝试链接两个类之间的属性。让我解释一下:

我有一个System课程,belongs_to我的Area课程(一个地区has_many系统)。它们都有一个名为price的属性。一个区域的价格必须是它所有系统价格的总和。

有没有办法建立这种关系而不必每次更改系统价格之一时更新区域的价格? (我做的事情像@system.area.price = @system.area.price + @system.price

2 个答案:

答案 0 :(得分:0)

除非你想走向将数据库引入触发器的黑暗危险之路,否则简短的回答并不是真的。

答案很长,你需要让after_save个处理程序为你做这个调整。始终确保您应用此方式的方式是增量,而不是重置,否则您将遇到竞争条件。

在你的简短例子中,你不清楚你要求的是什么。除非Area有base_price,否则您将无限期地增加系统价格。您需要在此处计算出确切的逻辑,但您需要的一个例子是:

class System < ActiveRecord::Base
  belongs_to :area
  after_save :update_area_price

protected
  def update_area_price
    self.area and self.area.increment!(:price, self.price)
  end
end

答案 1 :(得分:0)

如果您在数据库中处理此问题,那么sum计算将为您执行此操作:http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html

class Area < ActiveRecord::Base
  has_many :systems
  def price
    systems.sum('price')
  end
end

您可以完全删除区域的价格字段。