before_create - уничтожить несколько записей - PullRequest
0 голосов
/ 14 июля 2010

Хорошо, я пытаюсь уничтожить несколько записей в 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

Моя проблема в том, что уничтожается только одна запись.

Другое дело, что если я использую уничтожить! (Я хочу, чтобы возникло исключение, если оно не уничтожается), тогда я получаю сообщение об ошибке.

Как выполнить уничтожение нескольких записей в before_create?

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

А что если вы попробуете это?

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

уничтожить!не командаЕсли это не разрушит по какой-либо причине, вы получите ошибку.Взрыв (!) Не был бы необходим для этой операции.

1 голос
/ 14 июля 2010

Насколько я знаю, вы не можете отправить массив идентификаторов в destroy_all с параметром: id.Я бы настроил это так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...