Обновление:
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