为不同的事件运行两个不同的after_create语句

时间:2012-12-10 03:20:07

标签: ruby-on-rails ruby if-statement callback

我有两个不同的after_create回调。我只希望在创建的记录中存在字段时运行

我知道如何做到这一点,但我不能完全理解

#rental.rb
after_create :delete_booking , :if => ":booking_no = 'NOT NULL'"
after_create :set_requires_allocation


 def delete_booking
  @booking = Booking.where(:booking_no => self.booking_no).first
 @booking.destroy
end

def set_requires_allocation
self.user.requires_allocation = 'false'
end

set_requires_allocation实际上会通过在users表中将'true'更改为'false'来实现我的想法吗?

感谢

2 个答案:

答案 0 :(得分:0)

  

after_create:delete_booking,:if => Proc.new {| rental |   rental.booking_no.present? }

答案 1 :(得分:0)

由于您有两个after_create回调,因此可以将它们合并为一行:

after_create :delete_booking, :set_requires_allocation, :if => Proc.new {|r| r.booking_no.present?}

如果您希望在set_requires_allocation回调中更新相关用户,那么您可能希望执行以下操作:

def set_requires_allocation
   user.update_column(:requires_allocation, false)
end

仅将属性设置为false,实际上不会保存用户记录。我选择了update_column,因为这样可以防止触发用户模型上的任何回调或验证。如果您确实想在User上触发回调,则使用update_attribute(触发回调,不触发验证检查)或update_attributes,这将为用户保存验证检查和回调。