Rails - Validasi Keberadaan Asosiasi?

107

Saya memiliki model A yang memiliki asosiasi "has_many" ke model lain B. Saya memiliki persyaratan bisnis bahwa penyisipan ke dalam A memerlukan setidaknya 1 rekaman terkait ke B. Apakah ada metode yang dapat saya panggil untuk memastikan ini benar, atau apakah saya perlu menulis validasi khusus?

skaz
sumber

Jawaban:

167

Anda dapat menggunakan 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

atau cukup validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

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

Tetapi ada bug dengannya jika Anda akan menggunakan accepts_nested_attributes_fordengan :allow_destroy => true: Model bersarang dan validasi induk . Dalam topik ini Anda dapat menemukan solusi.

fl00r
sumber
18

-------- Rel 4 ------------

Sederhana validates presenceberhasil untuk saya

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

Dengan cara ini, Profile.createsekarang akan gagal. Saya harus menggunakan user.create_profileatau mengasosiasikan pengguna sebelum menyimpan file profile.

hexinpeter
sumber
6

Anda dapat memvalidasi asosiasi dengan validates_existence_of(yang merupakan plugin):

Contoh cuplikan dari entri blog ini :

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

Atau, Anda bisa menggunakan validates_associated. Sebagai catatan Faisal dalam komentar di bawah jawabannya, validates_associatedperiksa apakah objek terkait valid dengan menjalankan validasi kelas terkait. Itu tidak memeriksa keberadaan. Penting juga untuk dicatat bahwa asosiasi nihil dianggap valid.

Spyros
sumber
4

Jika Anda ingin memastikan bahwa pengaitan ada dan dijamin valid, Anda juga perlu menggunakan

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end
Sukeerthi Adiga
sumber
Bukankah lebih baik jika Anda dapat memberikan opsi tambahan untuk validatesmenyukai valid: truedaripada harus menelepon validates_associatedsecara terpisah.
Joshua Pinter