我有一个具有布尔属性的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
端
但这对我来说似乎很难看。
感谢您的帮助:)
·阿尔
答案 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,只有一个是真的。