如何在两个相互依赖的属性上运行回调函数?
在我的Rails应用程序中,我有一个Invoice
模型,其属性为date
和due_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
方法而不是同名属性。
关键问题似乎是我在两个相互依赖的不同属性( 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
都存在时,不应该使用质量赋值,除非date
始终排在第一位。
我认为您需要存储所有三个字段,只是不提供任何表单属性来编辑计算的字段。
虽然你的用例似乎是违反了“不要重复自己”,但我认为这是巧合重复的一个例子。 让我解释:
考虑你的下一个问题 – 你将在周末,假期等开始到期日。正是出于这个原因,我写了business_time gem:
https://github.com/bokmann/business_time
因此,在您添加10天的解决方案中,您现在可以添加10个工作日。 确切的截止日期现在可以在周末,假日等3天周末等情况下波动。如果你必须处理下雪天,就像美国东海岸大部分地区最近一样,你可以加入tham作为一个假期,并重新计算。 营业日数仍为10天,但到期日已发生变化。 工作日数是要保存的关键数据,而不是要计算的数据。 需要保存到期数据,因为它是在上下文中计算的一条信息,您需要保存这些信息以进行查询,而不是每次都尝试重新计算。
- ConnectionNotEstablished之后在JRuby中有一个multithreading环境
- 如何从ActiveRecord中获取每组的最新记录?
- rails对特定控制器和操作的ActiveRecordvalidation
- ActiveRecord :: EagerLoadPolymorphicError:无法急切加载多态关联
- 为什么Rails Active Record迁移会在mysql的varchar列上生成COLLATE utf8_bin
- Rails与activerecord共享会话
- ActiveRecord触摸导致死锁
- 获取Rails ActiveRecord’datetime’属性作为DateTime对象
- 如何检查一个数字是否在activerecord范围内?