Подтвердить что ты не робот

Validates_associated не проверяет существование ассоциаций

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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