为什么在属性更新为nil时未触发before_save / after_save?以及如何触发它?

时间:2011-04-13 00:07:13

标签: ruby-on-rails activerecord callback

更新

确定。我有另一种方式来描述这个。我正在保存一个项目,并且此项目及其所有子项都会调用Base.save。而且由于他们中的一些不再是这个项目的孩子,因为我已经取消选中它们,save没有被调用。听起来有点清楚。但仍然是用另一个词描述的同一个问题。为什么如果更新记录(虽然有些奇怪的方式)并且它的parent_id已更改,rails会不会像更新一样?

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

我的项目与他们自己有多对一的联系。我想在项目更改其父项目时为项目创建注释。当item.superitem_id从nil更改为某个id或从某个id更改为另一个id时,一切正常。但是当item.superitem_id从某个id变为nil时,没有任何反应。


在第一种情况下,日志显示:

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复选框”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 个答案:

答案 0 :(得分:3)

我的猜测是,在第二种情况下,您的关联已保存(即使它是同一个表),因此rails不会将其视为“自我”的更新。检查此帖子以强制使用“touch”强制对belongs_to进行回调:

"Before Save" callback on associations