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
Вы можете быть в состоянии обойтись только с первым, но у меня обоих есть более конкретные сообщения об ошибках.
Ответ 6
В Rails 3, validates_associated
, вероятно, вы ищете?
http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated