早上好,我在我的rails应用程序中遇到问题时尝试链接两个类之间的属性。让我解释一下:
我有一个System
课程,belongs_to
我的Area
课程(一个地区has_many
系统)。它们都有一个名为price
的属性。一个区域的价格必须是它所有系统价格的总和。
有没有办法建立这种关系而不必每次更改系统价格之一时更新区域的价格? (我做的事情像@system.area.price = @system.area.price + @system.price
)
答案 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
您可以完全删除区域的价格字段。