Rails: проверка существования ассоциации - PullRequest
15 голосов
/ 26 августа 2009

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

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

Ответы [ 5 ]

20 голосов
/ 16 июня 2012

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

16 голосов
/ 26 августа 2009

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

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

-ИЛИ-

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
5 голосов
/ 26 августа 2009

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

  validate :ensure_category_exists

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

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

1 голос
/ 25 октября 2012

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

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

0 голосов
/ 20 марта 2011

В Rails 3, validates_associated это, вероятно, то, что вы ищете? http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...