0

ブール列を追加したPrinterモデルがあります。masterプリンターbelongs_to :restaurantmasterフラグは、このプリンターがこのレストランのプライマリ プリンターであるかどうかを示します。

Printer モデルにメソッドがあります。

def set_master_on_create
  if self.restaurant.printers.empty?
    self[:master] = true
  else
    self[:master] = false
  end
end

このコールバックを設定します。before_create :set_master_on_create

このメソッドを として実行before_createすると、新しいプリンターの作成は失敗します。コールバックを変更しafter_validationて新しいオブジェクトを作成すると、:on => :createオプションを使用しても問題なく動作します。

Rails はオブジェクトをフリーズするので、特定の時点以降は値を変更できなくなりますRollbackか? どんな助けでも感謝します。

Rails 3.2.2 と sqlite を開発モードで使用しています。

4

1 に答える 1

1

問題は、false を返す before_create メソッドがオブジェクトを保存できないことだと思います。を追加してみてくださいreturn true

そして、マスター属性を次のように設定したと思います:self.master = true

def set_master_on_create
  if self.restaurant.printers.empty?
    self.master = true
  else
    self.master = false
  end

  return true
end

before_* コールバックがアクションをキャンセルすると、ROLLBACK が発行されます。after_* フックを含む任意のコールバックで例外を発生させる ROLLBACK をトリガーすることもできます。ただし、その場合、クライアントはそれを認識している必要があることに注意してください。通常の保存では、静かに false を返すのではなく、このような例外が発生するためです。 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

于 2012-03-04T21:53:21.013 に答える