Schienen - Vorhandensein der Assoziation validieren?

107

Ich habe ein Modell A mit der Zuordnung "has_many" zu einem anderen Modell B. Ich habe eine Geschäftsanforderung, dass für eine Einfügung in A mindestens 1 Datensatz für B erforderlich ist. Gibt es eine Methode, die ich aufrufen kann, um sicherzustellen, dass dies wahr ist? oder muss ich eine benutzerdefinierte Validierung schreiben?

skaz
quelle

Antworten:

167

Sie können validates_presence_of http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of verwenden

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

oder einfach validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

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

Aber es gibt ein Problem mit sich , wenn Sie verwenden accepts_nested_attributes_formit :allow_destroy => true: Nested Modelle und Eltern Validierung . In diesem Thema finden Sie eine Lösung.

fl00r
quelle
18

-------- Schienen 4 ------------

Einfach validates presencehat bei mir funktioniert

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

Auf diese Weise Profile.createwird nun fehlschlagen. Ich muss user.create_profileeinen Benutzer verwenden oder zuordnen, bevor ich a profile.

Hexinpeter
quelle
6

Sie können Assoziationen überprüfen mit validates_existence_of(was ein Plugin ist):

Beispielausschnitt aus diesem Blogeintrag :

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

Alternativ können Sie verwenden validates_associated. Wie Faisal in den Kommentaren unter der Antwort feststellt , wird validates_associatedüberprüft, ob das zugeordnete Objekt gültig ist, indem die zugehörigen Klassenüberprüfungen ausgeführt werden. Es wird nicht auf das Vorhandensein geprüft. Es ist auch wichtig zu beachten, dass eine Null-Assoziation als gültig angesehen wird.

Spyros
quelle
4

Wenn Sie sicherstellen möchten, dass die Zuordnung vorhanden ist und garantiert gültig ist, müssen Sie auch verwenden

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end
Sukeerthi Adiga
quelle
Wäre es nicht schön, wenn Sie eine zusätzliche Option passieren könnte validateswie valid: truestattdessen nennen zu haben validates_associatedgetrennt.
Joshua Pinter