我有一个拥有self belongs_to的模型:
class SyncType < ActiveRecord::Base
belongs_to :sync_type, touch: true
has_many :sync_types, -> { order('created_at ASC') }
end
我在数据库中保存了2个objets:
#<SyncType id: 99, description: "test", sync_type_id: nil, created_at: "2014-07-16 18:49:09", updated_at: "2014-07-16 18:49:09">
#<SyncType id: 95, description: "haha", sync_type_id: 99, created_at: "2014-07-16 18:31:48", updated_at: "2014-07-16 18:31:48">
所以,我需要获取所有不为我的公司提供父级的SyncType:
@sync_types_tree = SyncType.where("sync_type_id is null")
但是当我销毁id为99的对象时,它的引用不会更新id为95的对象(sync_type_id:99)。我该怎么做才能刷新它?当我销毁它时,我想把sync_type_id:nil。
根据导轨指南,&#34; touch:true,&#34;这可行,但不是。
http://guides.rubyonrails.org/association_basics.html#touch
我的临时解决方案:
@sync_types_to_destroy.each do |sync_to_destroy|
sync_to_destroy.sync_types.each do |child|
child.sync_type = nil
child.save
end
sync_to_destroy.destroy
end
如果你有更好的主意,请帮助我:P
答案 0 :(得分:2)
在has_many关联上设置:dependent选项:
has_many :sync_types, -> { order('created_at ASC') }, dependent: :nullify
现在,当您销毁父记录时,子项将使其sync_type_id属性无效。
sync_type = SyncType.where("sync_type_id is null").first
sync_type.destroy
使用您的示例记录,执行以下SQL:
BEGIN
UPDATE `sync_types` SET `sync_types`.`sync_type_id` = NULL WHERE `sync_types`.`sync_type_id` = 99 ORDER BY created_at ASC;
DELETE FROM `sync_types` WHERE `sync_types`.`id` = 99;
COMMIT
答案 1 :(得分:1)
您可以创建一个before_destroy回调,删除其他记录上的链接。
class SyncType < ActiveRecord::Base
before_destroy :remove_links
private
def remove_links
SyncType.where('sync_type_id = ?', id).update_all(sync_type_id: nil)
end
end