1

我有以下情况

class RecordA
  has_many :recordbs
end

class RecordB
  belongs_to :recorda
end

RecordA 有许多recordb,但其中只有一个可能是活动的recordb。我需要类似的东西myRecordA.active_recordb

如果我is_active向 RecordB 添加一个新列,那么我可能会is_active = true同时设置两条记录。

我可以使用哪种设计模式?

谢谢!

4

3 回答 3

5

让我们改变你的例子。有一个LectureRoom,有很多人,只有一个人可以担任讲师。

在 LectureRoom 中有一个属性来指示哪个 Person 是讲师会容易得多。这样,您无需更改多个人员记录即可更换讲师。您只需要更新 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 回答