validates_associated не проверяет наличие ассоциаций - PullRequest
12 голосов
/ 03 марта 2011

Кто-нибудь может понять, что здесь происходит? Я смог заставить свой код работать так, как я хочу, но я не могу понять, почему validates_associated не работает так, как я ожидал. Вот фрагмент моего кода:

class Flag < ActiveRecord::Base
  belongs_to :user
  belongs_to :post

  # allow only one flag per post per user
  validates_uniqueness_of :user_id, :scope => :post_id

  validates :user_id, :post_id, :presence => true
  validates_associated :user, :post

  attr_accessible :user_id, :post_id
end

С этим кодом я не могу сохранить флаг с user_id == nil. Я могу сохранить флаг с помощью user_id == 12345 (то есть некоторый user_id отсутствует в базе данных). Вот что говорится в спецификации API validates_associated:

validates_associated (* attr_names)

Проверяет, являются ли связанный объект или объекты сами по себе действительными. Работает с любой ассоциацией.
...
ПРИМЕЧАНИЕ. Эта проверка не завершится ошибкой, если связь не была назначена. Если вы хотите убедиться, что ассоциация присутствует и гарантированно действительна, вам также необходимо использовать validates_presence_of.

Мне удалось получить желаемое поведение, используя вместо этого:

  validates :user, :post, :presence => true

Мое понимание спецификации API состоит в том, что validates_associated проверяет связанную таблицу, чтобы увидеть, существует ли строка с идентификатором, соответствующим внешнему ключу флага , при условии, что внешний ключ не равен nil . Кто-нибудь может предложить какое-либо понимание этого? Я неправильно понимаю, как validates_associated должен работать?

Ответы [ 2 ]

26 голосов
/ 03 марта 2011

validates_associated просто запускает проверки, указанные в классе связанного объекта, он ничего не делает в отношении внешних ключей.

validates :user_id, :presence=>true гарантирует наличие user_id в вашей записи флага, но это все.

validates :user, :presence=>true используется на самой ассоциации и обеспечивает правильную настройку внешних ключей.

0 голосов
/ 03 марта 2011

Человек ... все, что я получил, это то, что validates_presence_of необходимо для того, чтобы это работало, как вы получили из API. Кажется, излишне проверять достоверность ассоциаций, но я нуб.

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