Rails 3 การตรวจสอบเกี่ยวกับความไม่ซ้ำในหลาย ๆ คุณลักษณะ


177

ฉันใช้ Rails 3.0.0.beta4

ฉันต้องการเพิ่มการตรวจสอบความถูกต้องเกี่ยวกับความเป็นเอกลักษณ์ของทั้งสองคุณลักษณะนั่นหมายความว่าแบบจำลองของฉันจะใช้งานได้ถ้าคู่ของ'recorded_at'และ'zipcode'ไม่ซ้ำกัน

ในหนึ่งคุณลักษณะที่นี่คือไวยากรณ์

validates :zipcode, :uniqueness => true

ขอบคุณ

คำตอบ:


333

ใน Rails 2 ฉันจะเขียนว่า:

validates_uniqueness_of :zipcode, :scope => :recorded_at

ในราง 3:

validates :zipcode, :uniqueness => {:scope => :recorded_at}

สำหรับหลายคุณลักษณะ:

validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}

7
ฉันจะบอกว่ามันมีเหตุผลมากกว่าที่จะบอกว่าคุณต้องrecorded_atไม่ซ้ำกันภายในขอบเขตของรหัสไปรษณีย์ validate :recorded_at, : uniqueness => { :scope => :zipcode }
Ariejan

2
คุณยังสามารถใช้งานรางได้ 2 ทางและฉันพบว่าสามารถอ่านได้มากขึ้นเว้นแต่คุณจะทำการตรวจสอบหลายประเภทในคุณสมบัติเดียวกัน
zem

24
คุณจะตรวจสอบกลุ่มที่สามด้วยvalidates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}?
เกร็ก Guida

5
ฉันจะเพิ่มว่าถ้าคุณต้องการที่จะใช้:scopeกับคีย์ต่างประเทศคุณจะต้องใช้:fkey_idสัญลักษณ์แทนของ:fkeyคนแม้ว่าการทำงานแบบ "พื้นฐาน" :uniquenessบน:fkey
nbarraille

1
คุณอาจต้องการเพิ่มข้อความแสดงข้อผิดพลาดที่กำหนดเองเช่น, :message => ' is taken for this recorded date'
laffuste

96

ขอบเขตขอบเขตหลายพารามิเตอร์:

class TeacherSchedule < ActiveRecord::Base
  validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
end

http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of

สิ่งนี้ควรตอบคำถามของ Greg


Greg ดูเหมือนจะสนใจที่จะใช้ทางลัด 'validates' มากขึ้นดังนั้นคำตอบที่รวดเร็วสำหรับคำถามของเขาคือ "ใช่"
elc

สิ่งนี้ค่อนข้างสำคัญที่ต้องทราบฉันกำลังมองหาสิ่งนี้อย่างแน่นอนหากฉันควรใช้ _id (หรือไม่) เมื่อตรวจสอบการเชื่อมโยงในขอบเขต
Francesco Belladonna

คำตอบนี้ใช้ได้กับ Rails 4.1.6 validates_uniqueness_of: cart_id, ขอบเขต: [: location_id,: plug_id]
Conor

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