Yanıtlar:
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_table
bir değişkende depolayabilir veya modelin GroupUser
kendi içinde kullanılıyorsa, örneğin a yerine scope
kullanabilirsinizarel_table[:user_id]
GroupUser.arel_table[:user_id]
@ Jbearden'in cevabına Rails 4.0 sözdizimi kredisi
GroupUser.where(other_condition: true).where.not(user_id: user_id)
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.
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)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
İlişkilendirmelerle uğraşırken SQL sorgusuna her zaman tablo adını dahil etmelisiniz .
Aslında, başka bir tabloda user_id
sü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 not
eklenmiştir:
GroupUser.where.not(user: me)