[英]How to run a callback function on two attributes that depend on each other?
在我的Rails应用程序中,我有一个具有date
和due_date
属性的Invoice
模型。
为了简单起见,我不想用户手动输入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
方法,而不是同名的属性。
关键问题似乎是我对彼此依赖的两个不同属性( date
和days_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
编辑如果date
和days_allowed
都存在, days_allowed
应该使用批量分配,除非date
始终排在最前面。
我认为您需要存储所有三个字段,只是不提供任何用于编辑计算字段的表单属性。
虽然您的用例似乎违反了“不要重复自己”,但我认为这是巧合重复的一个实例。 让我解释:
考虑您的下一个问题-您将开始在周末,假期等开始安排到期日。正是出于这个原因,我编写了business_time gem:
https://github.com/bokmann/business_time
因此,在您添加10天的解决方案中,您现在可以添加10个工作日。 现在,确切的到期日期可能会在周末,假期创建的3天周末等之间波动。如果您不得不处理下雪天,例如美国东海岸的大多数地区最近都必须这样做,则可以将tham添加为放假然后重新计算。 工作日仍为10个工作日,但截止日期已更改。 工作日数是要保存的关键数据,而不是要计算的数据。 需要保存到期数据,因为它是在上下文中计算出的一条信息,您希望将其保存以进行查询,而不是每次都尝试重新计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.