Проверка на включение в ассоциацию ActiveRecord has_many - PullRequest
0 голосов
/ 28 октября 2009

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

У меня есть модель ActiveRecord с именем Widget, в которой есть несколько полей, мы будем называть их field_a и field_b, в дополнение к стандартным полям Rails. У меня также есть модель Person с множеством виджетов через ассоциацию has_many (Person.widgets).

В действии create моего контроллера для Widget я хочу проверить, чтобы убедиться, что новый Widget, который я создаю из параметров {@widget = Widget.new (params [: widget])}, не существует в Person Коллекция .widgets перед сохранением этого нового виджета в базу данных, но с использованием Person.widgets.include? (@ widget) не дает мне результатов, которые требуют, если field_a и field_b имеют те же значения, что и виджет в коллекции.

Я предполагаю, что это потому, что новый виджет (@widget) технически не существует в этой коллекции, потому что это новая запись, хотя ее важные атрибуты (field_a и field_b) могут совпадать с уже существующими в БД, связанной с пример личности.

Есть какие-нибудь мысли о том, как можно проверить это, чтобы я не создавал функционально дублированные виджеты в БД, связанные с одним и тем же экземпляром Person? Я пытался переопределить хэш, eql? и == методы на модели Widget, но это сломало некоторые другие вещи ... слава Богу, за TDD! : -)

Спасибо, Mike

Ответы [ 2 ]

0 голосов
/ 28 октября 2009
class Widget
  before_save :validate_unique_for_person
  def matches?(w)
    field_a == w.field_a && field_b == w.field_b
  end
  def validate_unique_for_person
    errors.add("base","widget already exists for person") if person.widgets.any? { |w| matches?(w) && self != w }
  end
end
0 голосов
/ 28 октября 2009

Есть ли причина, по которой вы не можете просто использовать ActiveRecord::Validations#validates_uniqueness_of?

validates_uniqueness_of :field_a, :scope => [:person_id, :field_b]
validates_uniqueness_of :field_b, :scope => [:person_id, :field_a]

Нужно сделать свое дело, даже если сообщения проверки иногда могут быть немного запутанными. Но для этого нужна опция: message для проверок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...