Может ли кто-нибудь понять, что здесь происходит? Мне удалось заставить мой код работать так, как я этого хочу, но я не могу понять, почему 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 не в базе данных). Вот что говорит спецификация validates_associated API:
validates_associated (* attr_names)
Проверяет, действительно ли связан объект или объекты. Работает с любыми ассоциациями.
...
ПРИМЕЧАНИЕ. Эта проверка не сработает, если ассоциация не была назначена. Если вы хотите убедиться, что ассоциация присутствует и гарантирована быть действительной, вам также необходимо использовать validates_presence_of.
Мне удалось получить желаемое поведение, используя это вместо:
validates :user, :post, :presence => true
Мое понимание спецификации API заключается в том, что validates_associated проверяет связанную таблицу, чтобы увидеть, существует ли строка с идентификатором, соответствующим внешнему ключу Flag , если внешний ключ не равен nil. Кто-нибудь может рассказать об этом? Я не понимаю, как работает validates_associated?