1

私は次のような状況にあります

class RecordA
  has_many :recordbs
end

class RecordB
  belongs_to :recorda
end

RecordAには多くのrecordbがありますが、アクティブなrecordbである可能性があるのはそのうちの1つだけです。私はのようなものが必要ですmyRecordA.active_recordb

is_activeRecordBのような新しい列を追加すると、 2つのレコードをis_active = true同時に設定するという潜在的な問題が発生します。

どのデザインパターンを使用できますか?

ありがとう!

4

3 に答える 3

5

あなたの例を変えてみましょう。多くの人がいる講義室があり、インストラクターになることができるのは1人だけです。

どの Person が講師であるかを示すために、LectureRoom に属性を設定する方がはるかに簡単です。そうすれば、インストラクターを交換するために複数の People レコードを変更する必要がなくなります。LectureRoom レコードを更新するだけです。

于 2009-10-11T22:42:34.880 に答える
3

名前付きスコープを使用して、アクティブな講師を見つけます。

class Person
  named_scope :currently_speaking, :conditions => {:active => true}
end

次に、それを ClassRoom の講師と呼びます。

class ClassRoom
  def lecturer
    people.currently_speaking.first
  end
end

本当の問題は、他の人をアクティブにしたときに、その人だけがアクティブになるようにすることです。私はこのようにするかもしれません:

class Person
  belongs_to :class_room

  before_save :ensure_one_lecturer

  def activate!
    self.active = true
    save
  end

  def ensure_one_lecturer
    if self.active && changed.has_key?(:active)
      class_room.lecturer.update_attribute(:active, false)
    end
  end

end

このようにして、すべてがトランザクションで行われます。アクティブな状態を変更した場合にのみ行われ、非常に簡単にテストする必要があります (私はこれをテストしていません)。

于 2009-10-12T03:15:04.180 に答える
1

このために、RecordB でクラス メソッドを定義できます。

class RecordB < ActiveRecord::Base
  def self.active
    first(:conditions => { :active => true }
  end
end
于 2009-10-11T20:59:13.850 に答える