Только одна запись верна, все остальные ложны, в рельсах - PullRequest
0 голосов
/ 11 октября 2009

У меня следующая ситуация

class RecordA
  has_many :recordbs
end

class RecordB
  belongs_to :recorda
end

RecordA имеет много записей, но только один из них может быть активной записью. Мне нужно что-то вроде myRecordA.active_recordb

Если я добавлю новый столбец, такой как is_active, в RecordB, у меня возникнет потенциальная проблема установки двух записей на is_active = true одновременно.

Какой шаблон дизайна я могу использовать?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 12 октября 2009

Давайте изменим ваш пример. Есть LectureRoom, где много людей, и только один человек может быть инструктором.

Было бы намного проще просто иметь атрибут в LectureRoom, чтобы указать, какой Персона является инструктором. Таким образом, вам не нужно менять несколько записей людей, чтобы поменять инструктора. Вам просто нужно обновить запись LectureRoom.

3 голосов
/ 12 октября 2009

Я бы использовал именованную область видимости, чтобы найти активного лектора.

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

Таким образом, все делается в транзакции, только если вы изменили активное состояние, и должно быть довольно легко протестировано (я не проверял это).

1 голос
/ 12 октября 2009

Вы можете определить метод класса в RecordB для этого:

class RecordB < ActiveRecord::Base
  def self.active
    first(:conditions => { :active => true }
  end
end
...