Рейки - підтвердити наявність асоціації?


107

У мене є модель A, яка має асоціацію "has_many" з іншою моделлю B. У мене є вимога бізнесу, щоб вставка в A вимагала принаймні 1 асоційованого запису до B. Чи є метод, який я можу зателефонувати, щоб переконатися, що це правда, чи мені потрібно написати спеціальну перевірку?

Відповіді:


167

Ви можете використовувати validates_presence_of http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

class A < ActiveRecord::Base
  has_many :bs
  validates_presence_of :bs
end

або просто validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

class A < ActiveRecord::Base
  has_many :bs
  validates :bs, :presence => true
end

Але з цим є помилка, якщо ви будете використовувати accepts_nested_attributes_forз :allow_destroy => true: Вкладені моделі та перевірку батьків . У цій темі ви можете знайти рішення.


18

-------- Рейки 4 ------------

Простий validates presenceпрацював для мене

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

Таким чином, Profile.createтепер не вдасться. Я повинен використовувати user.create_profileабо пов’язати користувача перед збереженням a profile.


6

Ви можете перевірити асоціації за допомогою validates_existence_of(який є плагіном):

Приклад фрагмента з цієї записи в блозі :

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :taggable, :polymorphic => true
  validates_existence_of :tag, :taggable

  belongs_to :user
  validates_existence_of :user, :allow_nil => true
end

Як варіант, ви можете використовувати validates_associated. Як зазначає Файсал у коментарях під відповіддю, validates_associatedперевіряє, чи пов'язаний об'єкт дійсний, запустивши відповідні перевірки класу. Це не перевіряє на наявність. Також важливо зауважити, що нульова асоціація вважається дійсною.


4

Якщо ви хочете переконатися, що асоціація є присутнім і гарантовано дієвим, вам також потрібно скористатися

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

Не було б непогано, якби ви могли пройти додатковий варіант, який validatesподобається, valid: trueзамість того, щоб телефонувати validates_associatedокремо.
Джошуа Пінтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.