通过更改其他项目的状态来保证唯一性

时间:2012-07-01 14:02:10

标签: ruby-on-rails-3 validation activerecord unique

我有一个具有布尔属性的Page模型:is_root。如果该值设置为true,则该值应该是唯一的,因此通过在一个项目上将此值设置为true,将其设置为true的其他值设置为false。它只是交换活动项目。

有没有优雅的“轨道”方式来做到这一点?目前我正在使用这个:

class Page < ActiveRecord::Base
  attr_accessible :is_root
  before_save :guarantee_uniqueness_of_is_root

  def guarantee_uniqueness_of_is_root
    if self.is_root?
      Page.where(:is_root => true).each do |p|
        p.update_attribute(:is_root, false) if p != self
      end
    end
  end

end

但这对我来说似乎很难看。

感谢您的帮助:)

·阿尔

1 个答案:

答案 0 :(得分:1)

我认为,你所寻找的并不是唯一性:),但一次只存在一个根页面,所以当以root身份添加页面时,重置现有的根页面,确保只存在一个根页面在任何时候。

否则,人们怎么能想象一个布尔列是唯一的:)只有两个记录:)

class Page < ActiveRecord::Base
  attr_accessible :is_root
  before_save :ensure_single_root_page

  def ensure_single_root_page
    Page.update_all(:is_root => false) if self.is_root?
  end
end

此外,我建议,如果您可以将根页面ID存储在其他位置,请说设置表或这些页面所属的其他表。拥有这样一个布尔列并不好,你知道is_root列中的所有值都是false,只有一个是真的。