0

OK、before_create で複数のレコードを破棄しようとしています:

class InventoryItem < ActiveRecord::Base
  belongs_to :user
  belongs_to :item

  before_create :replace_owned_items

  protected

  def replace_owned_items
    user = self.user
    item = self.item

    owned_items = user.retrieve_owned_items(item)
    unless owned_items.blank?
      owned_items.each do |o|
        o.destroy
      end
    end
  end

end

私の問題は、1 つのレコードだけが破棄されることです。

もう 1 つは、destroy! を使用する場合です。(破棄しない場合は例外を発生させたい)、その後、完全にエラーが発生します。

before_create で複数のレコードを破棄するにはどうすればよいですか?

4

2 に答える 2

2

これを試してみたらどうですか?

def replace_owned_items
  owned_items = user.retrieve_owned_items(item).map(&:id)
  Item.destroy_all(:id => owned_items) unless owned_items.blank?
end

破壊する!コマンドではありません。なんらかの理由で破棄されない場合は、エラーが発生します。この操作には強打 (!) は必要ありません。

于 2010-07-14T04:22:01.707 に答える
1

私の知る限り、:idパラメーターを使用してidの配列をdestroy_allに送信することはできません。私はこれを次のように微調整します:

def replace_owned_items
  owned_items = user.retrieve_owned_items(item).map(&:id)
  for item in owned_items do
    Item.destroy(item.to_i)
  end
end

しかし、私はあなたが以前持っていたものがうまくいくはずだと思います(以下の私の例は、retrieve_owned_itemsが何もない場合に空白の配列を返すと仮定しています:

def replace_owned_items
  owned_items = user.retrieve_owned_items(item)
  for item in owned_items
    item.destroy
  end
end
于 2010-07-14T13:08:08.357 に答える