ฉันมีโมเดล A ที่มีการเชื่อมโยง "has_many" กับโมเดลอื่น B ฉันมีข้อกำหนดทางธุรกิจที่การแทรกใน A ต้องมีอย่างน้อย 1 เร็กคอร์ดที่เกี่ยวข้องกับ B มีวิธีใดบ้างที่ฉันสามารถเรียกเพื่อให้แน่ใจว่านี่เป็นความจริง หรือฉันต้องเขียนการตรวจสอบความถูกต้องเอง?
ฉันมีโมเดล A ที่มีการเชื่อมโยง "has_many" กับโมเดลอื่น B ฉันมีข้อกำหนดทางธุรกิจที่การแทรกใน A ต้องมีอย่างน้อย 1 เร็กคอร์ดที่เกี่ยวข้องกับ B มีวิธีใดบ้างที่ฉันสามารถเรียกเพื่อให้แน่ใจว่านี่เป็นความจริง หรือฉันต้องเขียนการตรวจสอบความถูกต้องเอง?
คำตอบ:
คุณสามารถใช้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
: รุ่นที่ซ้อนกันและการตรวจสอบของผู้ปกครอง ในหัวข้อนี้คุณสามารถหาวิธีแก้ปัญหาได้
-------- ราง 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
.
คุณสามารถตรวจสอบการเชื่อมโยงกับ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
ตรวจสอบว่าวัตถุที่เกี่ยวข้องนั้นถูกต้องหรือไม่โดยเรียกใช้การตรวจสอบความถูกต้องของคลาสที่เกี่ยวข้อง ไม่ได้ตรวจสอบว่ามีอยู่หรือไม่ สิ่งสำคัญที่ควรทราบคือการเชื่อมโยงศูนย์ถือว่าถูกต้อง
หากคุณต้องการให้แน่ใจว่าการเชื่อมโยงนั้นมีอยู่และรับประกันว่าถูกต้องคุณต้องใช้ด้วย
class Transaction < ActiveRecord::Base
belongs_to :bank
validates_associated :bank
validates :bank, presence: true
end
validates
ชอบvalid: true
แทนที่จะต้องโทรvalidates_associated
แยกกัน