Rails: подтверждение существования ассоциации

У меня есть модель Category и Post, причем каждое сообщение принадлежит категории. Перед созданием или обновлением сообщения мне нужно проверить, что выбранная категория существует. Какой лучший способ проверить эту информацию?

В настоящий момент я нахожу в контроллере, чтобы убедиться, что эта категория существует. Можно ли поместить эти валидации в модель?

Ответы

Ответ 1

http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

class Post < ActiveRecord::Base
  belongs_to :category
  validates_presence_of :category 
end

-OR -

class Post < ActiveRecord::Base
  belongs_to :category
  validates :category, presence: => true
end

Версии Rails до 3.2:

class Post < ActiveRecord::Base
  belongs_to :category
  validates_existence_of :category 
end

Ответ 2

В Rails 3.2, validates_existence_of заменяется validates_presence_of.

Ответ 3

Я поместил это в свою модель:

  validate :ensure_category_exists

  def ensure_category_exists
    errors.add('Category') unless self.blog.categories.find_by_id(self.category_id)
  end

Что печатает "Категория недействительна", если категория не существует для родительского блога.

Ответ 4

В моем способе мышления лучшим выбором является этот камень: https://github.com/perfectline/validates_existence

Он проверяет существование связанной модели в базе данных. Представьте, что у вас есть раскрывающееся поле, которое возвращает некоторые данные об мусоре, даже если вы ничего не выбираете (по умолчанию не выбран первый ярлык поля как значение). Проверка присутствия не будет работать, поскольку она будет передаваться для существующих данных. Но мы хотим какое-то ограничение, и эта проверка на стороне БД - вот что решает проблему.

Ответ 5

Это определенно стоит упомянуть мой опыт. Это для Rails 4 (возможно, и других версий).

Данный объект имеет has_many или has_one модели.

Проверка, которая обеспечит наличие введенной ассоциации (идентификатора ассоциации), даже если в представлении указан идентификатор.

validates_presence_of :model

НЕ ТО ЖЕ, как проверка, которая гарантирует, что что-то введено (не пусто) во входных данных.

validates_presence_of :model_id

Вы можете быть в состоянии обойтись только с первым, но у меня обоих есть более конкретные сообщения об ошибках.