0

ブール値のプロパティ :is_root を持つページ モデルがあります。この値が true に設定されている場合、この値は一意である必要があるため、1 つのアイテムでこれを 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

終わり

しかし、これは私には非常に醜いようです。

ご協力いただきありがとうございます :)

アルネ

4

1 に答える 1

1

あなたが探しているのは正確には一意性ではないと思います:)が、一度に1つのルートページしか存在しないため、ページがルートとして追加されると、既存のルートページをリセットして、常に1つのルートページのみが存在するようにします.

そうでなければ、ブール列が一意であるとどのように想像できるでしょうか:)レコードが2つしかありません:)

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 であり、1 つだけが true であることがわかっているようなブール列を持つのは良くありません。

于 2012-07-02T05:40:22.297 に答える