Почему before_save / after_save не запускается при обновлении атрибута до nil? И как это вызвать? - PullRequest
2 голосов
/ 13 апреля 2011

Обновление:

Ok. У меня есть другой способ описать это. Я сохраняю элемент, и для этого элемента и всех его дочерних элементов вызывается Base.save. И поскольку некоторые из них больше не являются этими предметами, дети, потому что я их не отмечал, save не вызывается на них. Это звучит немного яснее. Но все же это тот же вопрос, который описан другими словами. Почему, если запись обновляется (каким-то странным образом), а ее parent_id изменяется, рельсы не делают это обновлением?

=============================================== =======================

Мои предметы связаны между собой. Я хочу создавать комментарии к элементам, когда элемент меняет свой родительский элемент. И все работает нормально, когда item.superitem_id меняется с nil на какой-то id или с некоторого id на другой id. Но ничего не происходит, когда item.superitem_id меняется с некоторого идентификатора на ноль.


В первом случае журнал показывает:

UPDATE "items" SET "superitem_id" = 3, "updated_at" = '2011-04-12 23:07:05.566609' WHERE "items"."id" = 5

А во втором:

UPDATE "items" SET "superitem_id" = NULL WHERE "items"."superitem_id" = 3 AND "items"."id"



Так. Предмет определенно изменился. Но почему он не обновляется и before_save не вызывается?


Модель:

class Item < ActiveRecord::Base

  before_save :generate_comments

  has_many :subitems, :class_name => "Item", :foreign_key => "superitem_id"
  belongs_to :superitem, :class_name => "Item"

  private
    def generate_comments
      @comment = self.comments.build(:content => "Test: #{self.superitem_id}")
      @comment.save
    end

end

Просмотр с флажками из «HABTM checkboxes» railscast:

<% for subitem in @potential_subitems %>
  <%= check_box_tag "item[subitem_ids][]", subitem.id, @item.subitems.include?(subitem) %>
<% end %>

и контроллер:

def update
  params[:item][:subitem_ids] ||= []
  @item = Item.find(params[:id])
  @item.update_attributes(params[:item])
end

1 Ответ

3 голосов
/ 13 сентября 2011

Мое дикое предположение состоит в том, что во втором случае ваша ассоциация сохраняется (даже если это та же таблица), поэтому rails не видит ее как обновление "self".Проверьте это сообщение, чтобы принудительно вызвать обратный вызов для принадлежащего объекта «touch»:

«Перед сохранением» обратного вызова для ассоциаций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...