Rails - Convalidare la presenza di associazione?


107

Ho un modello A che ha un'associazione "has_many" a un altro modello B. Ho un requisito aziendale che un inserimento in A richiede almeno 1 record associato a B. C'è un metodo che posso chiamare per assicurarmi che sia vero, o devo scrivere una convalida personalizzata?

Risposte:


167

Puoi utilizzare 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

o semplicemente validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

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

Ma c'è un bug se lo userai accepts_nested_attributes_forcon :allow_destroy => true: Modelli annidati e convalida genitore . In questo argomento puoi trovare la soluzione.


18

-------- Rotaie 4 ------------

Semplice ha validates presencefunzionato per me

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

In questo modo, Profile.createora fallirà. Devo utilizzare user.create_profileo associare un utente prima di salvare un file profile.


6

Puoi convalidare le associazioni con validates_existence_of(che è un plugin):

Snippet di esempio da questo post di blog :

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

In alternativa, puoi usare validates_associated. Come faisal osserva nei commenti sotto la risposta, validates_associatedcontrolla se l'oggetto associato è valido eseguendo le convalide di classe associate. Essa non verificare la presenza. È anche importante notare che un'associazione nulla è considerata valida.


4

Se vuoi assicurarti che l'associazione sia presente e garantita per essere valida, devi anche usare

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

Non sarebbe bello se potessi passare un'opzione aggiuntiva validatescome mi piace valid: trueinvece di dover chiamare validates_associatedseparatamente.
Joshua Pinter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.