Bagaimana saya bisa menemukan catatan di database saya dengan kondisi yang tidak sama? Saya sudah memiliki ini sekarang, tetapi adakah cara yang bagus untuk melakukannya?
GroupUser.where('user_id != ?',me)
Bagaimana saya bisa menemukan catatan di database saya dengan kondisi yang tidak sama? Saya sudah memiliki ini sekarang, tetapi adakah cara yang bagus untuk melakukannya?
GroupUser.where('user_id != ?',me)
Jawaban:
Dalam Rails 4.x (Lihat http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
Di Rel 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Untuk mempersingkat panjang, Anda bisa menyimpan GroupUser.arel_table
dalam variabel atau jika menggunakan di dalam model GroupUser
itu sendiri misalnya, dalam scope
, Anda dapat menggunakan arel_table[:user_id]
bukanGroupUser.arel_table[:user_id]
Kredit sintaks Rails 4.0 untuk jawaban @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Satu-satunya cara Anda bisa membuatnya lebih menarik adalah dengan MetaWhere .
MetaWhere memiliki sepupu baru yang disebut Squeel yang memungkinkan kode seperti ini:
GroupUser.where{user_id != me}
Tak perlu dikatakan lagi, bahwa jika ini adalah satu-satunya refactor yang akan Anda buat, itu tidak layak menggunakan permata dan saya hanya akan bertahan dengan apa yang Anda dapatkan. Squeel berguna dalam situasi di mana Anda memiliki banyak pertanyaan kompleks yang berinteraksi dengan kode Ruby.
Rel 4:
Jika Anda ingin menggunakan keduanya tidak sama dan sama, Anda dapat menggunakan:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Jika Anda ingin menggunakan berbagai operator (mis. >
, <
), Pada titik tertentu, Anda mungkin ingin beralih notasi ke yang berikut:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
Anda harus selalu menyertakan nama tabel dalam kueri SQL saat berhadapan dengan asosiasi.
Memang jika tabel lain memiliki user_id
kolom dan Anda bergabung dengan kedua tabel, Anda akan memiliki nama kolom yang ambigu dalam kueri SQL (yaitu masalah).
Jadi, dalam contoh Anda:
GroupUser.where("groups_users.user_id != ?", me)
Atau sedikit lebih bertele-tele:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Perhatikan bahwa jika Anda menggunakan hash, Anda tidak perlu khawatir tentang itu karena Rails mengurusnya untuk Anda:
GroupUser.where(user: me)
Di Rails 4, seperti yang dikatakan oleh @ dr4k3, metode kueri not
telah ditambahkan:
GroupUser.where.not(user: me)
Di Rails 3, saya tidak tahu sesuatu yang lebih menarik. Namun, saya tidak yakin jika Anda sadar, kondisi tidak sama Anda tidak cocok dengan (NAMA pengguna) nilai NULL. Jika Anda menginginkannya, Anda harus melakukan sesuatu seperti ini:
GroupUser.where("user_id != ? OR user_id IS NULL", me)