我有一个名为Brand
的模型,其中有几个东西依赖于此示例中包含一个名为User
的模型。如果删除了Brand
,那么很多事情都会失败。如果删除Brand
,为其所有关系设置默认Brand
的最佳方法是什么?
我认为写这样的东西可能有用:
class User < ActiveRecord::Base
after_save :assign_to_default_brand, :if => :not_branded?
def not_branded?
!self.brand_id?
end
def assign_to_default_brand
self.brand_id = Brand.first
end
end
但它似乎没有按照我想要的方式行事。这里建立了最佳实践吗?欢呼声。
已更新
我已将default
布尔值抛到Brand
并写入此内容,但它似乎没有效果。我错过了什么吗?
class Brand < ActiveRecord::Base
after_save :assign_users_to_default
def assign_users_to_default
self.users.all.each { |user| user.brand_id = Brand.where(:default => true).first.id if user.not_branded? }
end
end
答案 0 :(得分:1)
它应该是before_save
而不是after_save
这样,当保存实例时,该值将持久保存到数据库。
要删除品牌,您可以使用after_destroy
class Brand
after_destroy :switch_assigned_users
def switch_assigned_users
User.where(:brand_id => id).update_all(:brand_id => Brand.first)
end
end
这会找到分配给该品牌的所有用户,并将其切换到第一个。