在轨道中只有一个记录为真,其他所有记录都是假的

时间:2009-10-11 09:12:00

标签: ruby-on-rails design-patterns model has-many

我有以下情况

class RecordA
  has_many :recordbs
end

class RecordB
  belongs_to :recorda
end

RecordA有很多记录,但只有一个可能是一个活跃的记录。我需要像myRecordA.active_recordb

这样的东西

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

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

谢谢!

3 个答案:

答案 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