我有以下情况
class RecordA
has_many :recordbs
end
class RecordB
belongs_to :recorda
end
RecordA 有许多recordb,但其中只有一个可能是活动的recordb。我需要类似的东西myRecordA.active_recordb
如果我is_active
向 RecordB 添加一个新列,那么我可能会is_active = true
同时设置两条记录。
我可以使用哪种设计模式?
谢谢!
我有以下情况
class RecordA
has_many :recordbs
end
class RecordB
belongs_to :recorda
end
RecordA 有许多recordb,但其中只有一个可能是活动的recordb。我需要类似的东西myRecordA.active_recordb
如果我is_active
向 RecordB 添加一个新列,那么我可能会is_active = true
同时设置两条记录。
我可以使用哪种设计模式?
谢谢!
让我们改变你的例子。有一个LectureRoom,有很多人,只有一个人可以担任讲师。
在 LectureRoom 中有一个属性来指示哪个 Person 是讲师会容易得多。这样,您无需更改多个人员记录即可更换讲师。您只需要更新 LectureRoom 记录。
我会使用命名范围来查找活动讲师。
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
这样,一切都在事务中完成,只有在您更改了活动状态时才会完成,并且应该很容易测试(我没有测试过)。
您可以为此在 RecordB 上定义一个类方法:
class RecordB < ActiveRecord::Base
def self.active
first(:conditions => { :active => true }
end
end