我有以下情况
class RecordA
has_many :recordbs
end
class RecordB
belongs_to :recorda
end
RecordA有很多记录,但只有一个可能是一个活跃的记录。我需要像myRecordA.active_recordb
如果我向RecordB添加了一个新的列is_active
,那么我可能会同时将两个记录设置为is_active = true
。
我可以使用哪种设计模式?
谢谢!
答案 0 :(得分:5)
让我们改变你的榜样。有一个LectureRoom,有很多人,只有一个人可以作为教练。
在LectureRoom中拥有一个属性以指示哪个Person是教师要容易得多。这样,您无需更改多个People记录即可交换教师。您只需更新LectureRoom记录。
答案 1 :(得分: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
这样一切都在事务中完成,只有在你改变了活动状态时才会这样做,并且应该很容易测试(我没有测试过)。
答案 2 :(得分:1)
您可以在RecordB上为此定义一个类方法:
class RecordB < ActiveRecord::Base
def self.active
first(:conditions => { :active => true }
end
end