【问题标题】:Guarantee uniqueness by changing other item's state通过更改其他项目的状态来保证唯一性
【发布时间】:2012-07-01 14:02:10
【问题描述】:

我有一个具有布尔属性的页面模型: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

结束

但这对我来说似乎很丑。

感谢您的帮助:)

阿恩

【问题讨论】:

  • 我会将 self 排除在 Page.where 方法中,因此:.where('is_root = true and id != ?', self.id),并且可能会建议 .update_all(:is_root =&gt; false) 而不是循环,但我想不出比这更好的方法笼统地说。

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


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

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 2021-02-05
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多