如何在两个相互依赖的属性上运行回调函数?

在我的Rails应用程序中,我有一个Invoice模型,其属性为datedue_date

为简单起见,我不希望用户手动输入due_date ,而只需输入应添加到date 的天数

这就是我设置虚拟属性days_allowed

 class Invoice < ActiveRecord::Base belongs_to :user before_save :save_date attr_accessor :days_allowed def days_allowed # attribute reader (I need that too!) (due_date - date).to_i end def save_date self.due_date = date + days_allowed.days end end 

但是,当用户在表单中选择日期并输入天数(例如10天)时,我得到错误的结果,因为save_date回调引用了days_allowed方法而不是同名属性。

关键问题似乎是我在两个相互依赖的不同属性( datedays_allowed )上使用回调。

谁能告诉我如何解决这个难题?

谢谢你的帮助。

这种方法怎么样(不需要before_save ):

 class Invoice < ActiveRecord::Base belongs_to :user def days_allowed (due_date - date).to_i end def days_allowed=(days) self.due_date = date + days end end 

编辑datedays_allowed都存在时,不应该使用质量赋值,除非date始终排在第一位。

我认为您需要存储所有三个字段,只是不提供任何表单属性来编辑计算的字段。

虽然你的用例似乎是违反了“不要重复自己”,但我认为这是巧合重复的一个例子。 让我解释:

考虑你的下一个问题 – 你将在周末,假期等开始到期日。正是出于这个原因,我写了business_time gem:

https://github.com/bokmann/business_time

因此,在您添加10天的解决方案中,您现在可以添加10个工作日。 确切的截止日期现在可以在周末,假日等3天周末等情况下波动。如果你必须处理下雪天,就像美国东海岸大部分地区最近一样,你可以加入tham作为一个假期,并重新计算。 营业日数仍为10天,但到期日已发生变化。 工作日数是要保存的关键数据,而不是要计算的数据。 需要保存到期数据,因为它是在上下文中计算的一条信息,您需要保存这些信息以进行查询,而不是每次都尝试重新计算。