繁体   English   中英

如何对彼此依赖的两个属性运行回调函数?

[英]How to run a callback function on two attributes that depend on each other?

在我的Rails应用程序中,我有一个具有datedue_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方法,而不是同名的属性。

关键问题似乎是我对彼此依赖的两个不同属性( 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都存在, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM