ฉันจะค้นหาระเบียนในฐานข้อมูลของฉันในสภาพที่ไม่เท่ากันได้อย่างไร ตอนนี้ฉันมีสิ่งนี้แล้ว แต่มีวิธีการพูดแบบรางที่แปลกใหม่หรือไม่?
GroupUser.where('user_id != ?',me)
ฉันจะค้นหาระเบียนในฐานข้อมูลของฉันในสภาพที่ไม่เท่ากันได้อย่างไร ตอนนี้ฉันมีสิ่งนี้แล้ว แต่มีวิธีการพูดแบบรางที่แปลกใหม่หรือไม่?
GroupUser.where('user_id != ?',me)
คำตอบ:
ใน Rails 4.x (ดูhttp://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
ใน Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
หากต้องการลดความยาวให้สั้นลงคุณสามารถจัดเก็บGroupUser.arel_table
ตัวแปรหรือหากใช้ภายในแบบจำลองGroupUser
เช่นใน a scope
คุณสามารถใช้arel_table[:user_id]
แทนGroupUser.arel_table[:user_id]
เครดิตไวยากรณ์ Rails 4.0 สำหรับคำตอบของ @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
ราง 4
GroupUser.where.not(user_id: me)
วิธีเดียวที่คุณจะได้รับมันชอบเล่นอยู่กับMetaWhere
MetaWhere มีลูกพี่ลูกน้องรุ่นใหม่ที่เรียกว่าSqueelซึ่งอนุญาตให้ใช้รหัสเช่นนี้:
GroupUser.where{user_id != me}
มันเป็นไปโดยไม่ได้บอกว่าถ้านี่เป็น refactor ตัวเดียวที่คุณกำลังจะสร้างมันไม่คุ้มที่จะใช้อัญมณีและฉันจะยึดติดกับสิ่งที่คุณได้รับ Squeel มีประโยชน์ในสถานการณ์ที่คุณมีคำค้นหาที่ซับซ้อนจำนวนมากที่โต้ตอบกับรหัส Ruby
ราง 4:
หากคุณต้องการที่จะใช้ทั้งสองไม่เท่ากันและเท่าเทียมกัน, คุณสามารถใช้:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
หากคุณต้องการใช้ตัวดำเนินการต่างๆ (เช่น. >
, <
) ในบางจุดคุณอาจต้องการเปลี่ยนสัญกรณ์ต่อไปนี้:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
คุณควรเสมอรวมถึงชื่อตารางในแบบสอบถาม SQL เมื่อต้องรับมือกับสมาคม
หากตารางอื่นมีuser_id
คอลัมน์และคุณเข้าร่วมทั้งสองตารางคุณจะมีชื่อคอลัมน์ที่ไม่ชัดเจนในแบบสอบถาม SQL (เช่นปัญหา)
ดังนั้นในตัวอย่างของคุณ:
GroupUser.where("groups_users.user_id != ?", me)
หรือรายละเอียดเพิ่มเติมเล็กน้อย:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
โปรดทราบว่าหากคุณใช้แฮชคุณไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้เพราะ Rails จะดูแลให้คุณ:
GroupUser.where(user: me)
ใน Rails 4 ตามที่กล่าวโดย @ dr4k3 not
มีการเพิ่มวิธีการสืบค้น:
GroupUser.where.not(user: me)
ใน Rails 3 ฉันไม่รู้อะไรเลย อย่างไรก็ตามฉันไม่แน่ใจว่าคุณทราบหรือไม่ว่าเงื่อนไขที่ไม่เท่ากันของคุณไม่ตรงกับค่า NULL (user_id) ถ้าคุณต้องการคุณจะต้องทำสิ่งนี้:
GroupUser.where("user_id != ? OR user_id IS NULL", me)