При уничтожении одной записи уничтожается другая - PullRequest
1 голос
/ 08 января 2011

продуктов (например, iPod Classic): has_many =>: списки,: зависимые =>: уничтожить

списки (например, «Меня зовут Джо, и у меня есть iPod для продажи): own_to =>: product

Итак, если я удаляю данный продукт, все списки, которые на него ссылаются, удаляются. Это имеет смысл, и это умышленно.

Однако я пишу "объединение"«функции, где вы объединяете два продукта в один и объединяете их списки. Итак, скажем, мои два продукта -« iPod Color »и« iPod Classic », и я хочу объединить два. Я хочу сказать,«iPod Color, объединитесь с iPod Classic», и результат должен быть следующим:

  1. Все списки цветов iPod перенаправлены на продукт iPod Classic
  2. После изменения product_id,Списки сохранены
  3. Затем я удаляю продукт "iPod Color"

Хорошо, все должно работать нормально, без удаления каких-либо списков. Однако у меня естьэтот контроллер, и по какой-либо причине, когда я уничтожаю «iPod Color»Продукт, даже после подтверждения того, что листинги были перемещены в «iPod Classic» и сохранены в базе данных, листинги, которые ранее были указаны как «iPod Color», также уничтожаются, и я не могу понять, почему.Как будто они сохраняют какую-то связь с уничтоженным продуктом и, следовательно, начинают уничтожать себя.

Какая болезненно очевидная вещь, которую я упускаю?

def merge
    merging_from = Product.find(params[:id])
    merging_to = Product.find_by_model(params[:merging_to])

    unless merging_to.nil?
      unless merging_from.nil?
        unless merging_from == merging_to    # you don't want to merge something with itself         
          merging_from.listings.each do |l|
            l.product = merging_to
            l.save
          end

          # through some debugging, I've confirmed that my missing Listings are disappearing as a result of the following destroy call
          merging_from.destroy
        end
      end
    end

1 Ответ

4 голосов
/ 08 января 2011

Я видел то же поведение, и перезагрузка решила его.

def merge
  merging_from = Product.find(params[:id])
  merging_to = Product.find_by_model(params[:merging_to])

  if merging_from && merging_to && merging_from != merging_to
    merging_to.listings << merging_from.listings
    merging_from.reload.destroy
  end
end
...