[英]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.