Rails проверяет связь только при загрузке - PullRequest
0 голосов
/ 06 июля 2011

У меня есть модель активности, в которой есть участники: многие, и я хотел бы убедиться, что участник всегда существует при обновлении деятельности и ее участников. У меня есть следующий метод в моей модели деятельности, который добивается цели:

def must_have_participant
  if self.participants.size == 0 || self.participants.size == self.participants.to_ary.find_all{ |p| p.marked_for_destruction? }.count
    self.errors[:base] << I18n.t(:msg_activity_must_have_participant)
  end
end

Проблема в том, что участники загружаются лениво, если я просто обновляю упражнение самостоятельно, чего я бы хотел избежать. Я пробовал следующую альтернативу, однако, загружен? возвращает false при удалении всех участников с использованием флага: _destroy.

def must_have_participant
  if self.new_record? || self.participants.loaded?
    if self.participants.size == 0 || self.participants.size == self.participants.to_ary.find_all{ |p| p.marked_for_destruction? }.count
      self.errors[:base] << I18n.t(:msg_activity_must_have_participant)
    end
  end
end

Есть ли альтернатива загруженным? что я могу использовать, чтобы узнать, будут ли обновляться участники?

Ответы [ 2 ]

0 голосов
/ 08 января 2013

Для справки я изменил метод следующим образом:

def must_have_participant
  if self.new_record? || self.association(:participants).loaded?
    if self.participants.size == 0 || self.participants.size == self.participants.select{ |p| p.marked_for_destruction? }.size
      self.errors[:base] << I18n.t(:msg_must_have_participant)
    end
  end
end
0 голосов
/ 06 июля 2011

Я сделал что-то подобное в недавней проверке, которую я создал. Я искал исходную запись и проверил исходное значение с новым значением. Нет гарантий, что мой код будет работать для вас, но вот мой код для вашего приложения:

    orig_rec = self.find(id)
    if participant_ids.size != orig_rec.participant_ids.size

Обратите внимание, что я проверил размер member_ids вместо того, чтобы извлекать все записи участников и проверять их размер. Это должно быть более эффективным.

Я не знаю, есть ли какая-то встроенная функция для этого или нет в ruby, мне будет любопытно узнать, что может предложить кто-то, кто более специфичен для рельсов.

...