Кто-нибудь может понять, что здесь происходит? Я смог заставить свой код работать так, как я хочу, но я не могу понять, почему 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 должен работать?