Rails:如果没有分配或删除关系,则设置默认记录

时间:2013-11-22 02:35:23

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个名为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

1 个答案:

答案 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

这会找到分配给该品牌的所有用户,并将其切换到第一个。