Rails: ตรวจสอบความเป็นเอกลักษณ์ของสองคอลัมน์ (ร่วมกัน)


130

ฉันมีReleaseแบบจำลองmediumและcountryคอลัมน์ (อื่น ๆ ) ไม่ควรมีreleasesที่ใช้ร่วมกันmedium/ countryชุดค่าผสมที่เหมือนกัน

ฉันจะเขียนสิ่งนี้เป็นการตรวจสอบรางได้อย่างไร


คำตอบ:


231

คุณสามารถใช้การตรวจสอบความเป็นเอกลักษณ์กับscopeตัวเลือก

นอกจากนี้คุณควรเพิ่มดัชนีเฉพาะในฐานข้อมูลเพื่อป้องกันไม่ให้ระเบียนใหม่ผ่านการตรวจสอบเมื่อตรวจสอบพร้อมกันก่อนที่จะเขียน:

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end

+1 สำหรับดัชนี แต่ -1 สำหรับดัชนีuniqueเนื่องจากไม่รู้จัก สำหรับส่วนนั้นฉันได้ใช้คำตอบด้านล่าง
Aleks

7
ใช่ขอโทษที่สำคัญการตรวจสอบควรจะเป็นไม่ได้uniqueness uniqueดูเอกสารที่เชื่อมโยง แก้ไขคำตอบ
tompave

1
อืมดีขอบคุณ :) ในการทำซ้ำตัวเองการใส่ดัชนีจะนำการแก้ปัญหาไปสู่อีกระดับและไม่เหมือนกับโซลูชัน "การเข้ารหัส" อื่น ๆ ที่ฉันเคยพบมาก่อนที่จะพบคำตอบนี้ +1 สำหรับสิ่งนั้น
Aleks

70

คำตอบข้างต้นทั้งหมดไม่มีวิธีตรวจสอบความเป็นเอกลักษณ์ของแอตทริบิวต์หลายรายการในแบบจำลอง โค้ดด้านล่างนี้ตั้งใจจะบอกวิธีใช้หลายแอตทริบิวต์ในขอบเขต

validates :country, uniqueness: { scope: [:medium, :another_medium] }

มันจะตรวจสอบเอกลักษณ์ของcountryในทุกแถวที่มีค่าของและ mediumanother_medium

หมายเหตุ:อย่าลืมเพิ่มดัชนีในคอลัมน์ด้านบนซึ่งจะช่วยให้สามารถดึงข้อมูลได้อย่างรวดเร็วและเพิ่มการตรวจสอบความถูกต้องระดับ DB สำหรับระเบียนที่ไม่ซ้ำกัน

อัปเดต:สำหรับการเพิ่มดัชนีขณะสร้างตาราง

t.index [:medium, :another_medium], unique: true

41

คุณสามารถส่ง:scopeพารามิเตอร์ไปยังเครื่องมือตรวจสอบของคุณได้ดังนี้:

validates_uniqueness_of :medium, scope: :country

ดูเอกสารประกอบสำหรับตัวอย่างเพิ่มเติม


8
@Dennis ดีที่สุด "ได้ผล" แต่ไม่ได้ป้องกันสภาพการแข่งขัน หากไคลเอนต์สองรายส่งคำขอพร้อมกันทั้งคู่สามารถผ่านการตรวจสอบความถูกต้องได้หากทั้งคู่ไม่ได้เชื่อมโยงกับฐานข้อมูลก่อนที่อีกเครื่องจะได้รับการตรวจสอบ คุณต้องมีข้อ จำกัด เฉพาะของฐานข้อมูลเช่นเดียวกับคำตอบของ tompave
soupdog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.