0

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

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

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

结尾

但这对我来说似乎很丑陋。

谢谢你的帮助 :)

阿恩

4

1 回答 1

1

我认为,您正在寻找的并不完全是唯一性:),但是一次只存在一个根页面,因此当页面被添加为根时,请重置现有的根页面,确保任何时候都只存在一个根页面.

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

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 列中的所有值都是假的,只有一个是真的。

于 2012-07-02T05:40:22.297 回答