我有兩個型號Rails中after_create回調的優雅替代方案?
class Contract < ActiveRecord::Base
has_many :transactions
end
class Transaction < ActiveRecord::Base
belongs_to :contract
after_create :mark_contract_as_live
def mark_contract_as_live
k = self.contract
if !k.is_live
k.update_attributes(:is_live => true)
end
end
end
is_live是在合同模型中的布爾字段。默認情況下,合同默認爲不生存(is_live => false)。當記錄第一筆交易時,它被標記爲活(is_live => true)。通過上面的解決方案,這意味着每次創建事務都需要調用數據庫來檢查合同是否有效。有沒有其他的選擇?
如果合同有成千上萬的交易,這意味着這將被稱爲數千次,儘管它只與第一筆交易有關。
從一般意義上講,實現回調的優雅方式是什麼。這似乎凌亂?
我認爲這歸結爲階級責任問題。由合同決定是否存在或不存在;所以通過合約實例創建所有交易,然後標記它;或者根本不記錄'is_live'布爾值,只需定義is_live?作爲transactions.limit(1).count> 0(或更有效的替代方案) – struthersneil
那麼,您是否一次創建了數千個事務(在一次Rails請求期間)?如果沒有,那麼你不應該擔心額外的1或2個查詢。 –
@DavidGrayson是的,這是我沒有得到的部分 – Damien