Rails - ตรวจสอบการมีอยู่ของสมาคม?


108

ฉันมีโมเดล A ที่มีการเชื่อมโยง "has_many" กับโมเดลอื่น B ​​ฉันมีข้อกำหนดทางธุรกิจที่การแทรกใน A ต้องมีอย่างน้อย 1 เร็กคอร์ดที่เกี่ยวข้องกับ B มีวิธีใดบ้างที่ฉันสามารถเรียกเพื่อให้แน่ใจว่านี่เป็นความจริง หรือฉันต้องเขียนการตรวจสอบความถูกต้องเอง?

คำตอบ:


169

คุณสามารถใช้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หรือเชื่อมโยงผู้ใช้ก่อนที่จะบันทึกไฟล์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หรือคุณสามารถใช้ ตามที่Faisalบันทึกไว้ในความคิดเห็นด้านล่างคำตอบให้validates_associatedตรวจสอบว่าวัตถุที่เกี่ยวข้องนั้นถูกต้องหรือไม่โดยเรียกใช้การตรวจสอบความถูกต้องของคลาสที่เกี่ยวข้อง ไม่ได้ตรวจสอบว่ามีอยู่หรือไม่ สิ่งสำคัญที่ควรทราบคือการเชื่อมโยงศูนย์ถือว่าถูกต้อง


4

หากคุณต้องการให้แน่ใจว่าการเชื่อมโยงนั้นมีอยู่และรับประกันว่าถูกต้องคุณต้องใช้ด้วย

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

จะดีไหมถ้าคุณสามารถส่งตัวเลือกเพิ่มเติมให้validatesชอบvalid: trueแทนที่จะต้องโทรvalidates_associatedแยกกัน
Joshua Pinter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.