2

2つの異なる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」に変更することで実際に達成できると思いますか?

ありがとう

4

2 に答える 2

0

2つのafter_createコールバックがあるので、それらを1行にまとめることができます。

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ユーザーモデルでのコールバックや検証がトリガーされないようにするため、を選択しました。ユーザーに対してコールバックをトリガーする場合は、update_attribute(コールバックをトリガーし、検証チェックをトリガーしない)またはupdate_attributesを使用します。これにより、ユーザーは検証チェックとコールバックを使用できなくなります。

于 2012-12-10T03:33:40.110 に答える
0

after_create:delete_booking、:if => Proc.new {| Rentals | Rentals.booking_no.present?}

于 2012-12-10T03:24:11.137 に答える