Ray Modeli eşit olmayan yerleri bulun


127

Veritabanımda eşit olmayan bir durumda kayıtları nasıl bulabilirim? Şimdi bende bu var, ama bunu yapmanın güzel bir konuşma şekli var mı?

GroupUser.where('user_id != ?',me)

Sahip olduğunuz şey, bence bunu yapmanın oldukça iyi bir yolu.
Spyros

Yanıtlar:


229

Rails 4.x'te (Bkz. Http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )

GroupUser.where.not(user_id: me)

Raylarda 3.x

GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))

Uzunluğu kısaltmak için, GroupUser.arel_tablebir değişkende depolayabilir veya modelin GroupUserkendi içinde kullanılıyorsa, örneğin a yerine scopekullanabilirsinizarel_table[:user_id]GroupUser.arel_table[:user_id]

@ Jbearden'in cevabına Rails 4.0 sözdizimi kredisi


Derneklerde ne olacak? - has_many: group_users, -> {nerede.not (durum: "Reddedildi")}, aracılığıyla:: groups, foreign_key: "user_id"
ajbraus

4
Bir yan not olarak, aynı zamanda iyi zincirlenmiş olarak da çalışır:GroupUser.where(other_condition: true).where.not(user_id: user_id)
Enrico Carlesso


26

Daha meraklı hale getirmenin tek yolu MetaWhere ile .

MetaWhere denir daha yeni bir kuzeni vardır Squeel böyle bir kod verir:

GroupUser.where{user_id != me}

Söylemeye gerek yok, eğer yapacağınız tek refaktör buysa, bir mücevher kullanmaya değmez ve sadece sahip olduklarınıza bağlı kalırım. Squeel, Ruby koduyla etkileşim kuran birçok karmaşık sorgunuzun olduğu durumlarda kullanışlıdır.


4
MetaWhere harika, ancak bu görev bir mücevher eklemeden yapılabilir.
tybro0103

1
@ tybro0103 tabii ki görev yapılabilir (ve OP'nin yaptığı şekilde imho gayet iyi), soru bunu daha meraklı yapmakla ilgili. Bu yüzden bir mücevher olmadan daha meraklı bir şekilde yapılabileceğini düşünüyorsanız, bunun nasıl yapılacağıyla çok ilgilenirim.
Jakub Hampl

Vikrant'ın cevabı, sql veya başka bir mücevher içermeyen bir çözüm sunuyor. Ancak, düzeltildiğim için cevabınız kesinlikle en kodlayıcı dostu / havalı.
tybro0103

1
Bu kadar basit bir görevi başarmak için bir mücevher eklemek.
Bazukayla

Bu çok fazla.
courtimas

23

Raylar 4:

Hem eşit hem de eşit olmayanları kullanmak istiyorsanız , şunları kullanabilirsiniz:

user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)

Çeşitli operatörler (ör. >, <) Kullanmak istiyorsanız, bir noktada notasyonları aşağıdakilere değiştirmek isteyebilirsiniz:

GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)

Peki ya GroupUser.where(group_id: group_id).where.not(user_id: user_id)?
Enrico Carlesso

@EnricoCarlesso Gönderdiğiniz için teşekkürler. Cevabımı önerinizi içerecek şekilde güncelledim. Teşekkürler.
Rick Smith

9

İlişkilendirmelerle uğraşırken SQL sorgusuna her zaman tablo adını dahil etmelisiniz .

Aslında, başka bir tabloda user_idsütun varsa ve her iki tabloyu da birleştirirseniz, SQL sorgusunda belirsiz bir sütun adınız olur (yani sorunlar).

Öyleyse, örneğinizde:

GroupUser.where("groups_users.user_id != ?", me)

Ya da biraz daha ayrıntılı:

GroupUser.where("#{table_name}.user_id IS NOT ?", me)

Bir hash kullanıyorsanız, bunun için endişelenmenize gerek olmadığını unutmayın, çünkü Rails bunu sizin için halleder:

GroupUser.where(user: me)

Rails 4'te, @ dr4k3 tarafından söylendiği gibi, sorgu yöntemi noteklenmiştir:

GroupUser.where.not(user: me)

6

Rails 3'te daha meraklı bir şey bilmiyorum. Ancak, eşit olmayan koşulunuzun (user_id) NULL değerleri ile eşleşmediğinin farkında olup olmadığınızdan emin değilim. Bunu istiyorsan, şöyle bir şey yapman gerekecek:

GroupUser.where("user_id != ? OR user_id IS NULL", me)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.