Jak mogę znaleźć rekordy w mojej bazie danych o nierównym stanie? Mam to teraz, ale czy jest jakiś fantazyjny sposób na to, aby to zrobić?
GroupUser.where('user_id != ?',me)
Odpowiedzi:
W Rails 4.x (patrz http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
W Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Aby skrócić długość, możesz zapisać GroupUser.arel_table
w zmiennej lub jeśli używasz wewnątrz samego modelu GroupUser
, np. W a scope
, możesz użyć arel_table[:user_id]
zamiastGroupUser.arel_table[:user_id]
Kredyt składni Rails 4.0 do odpowiedzi @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Jedynym sposobem, aby uzyskać bardziej wyrafinowany wygląd, jest MetaWhere .
MetaWhere ma nowszego kuzyna, który nazywa się Squeel, który umożliwia taki kod:
GroupUser.where{user_id != me}
Jest rzeczą oczywistą, że jeśli jest to jedyny refaktor, który zamierzasz wykonać, nie warto używać klejnotu i po prostu trzymałbym się tego, co masz. Squeel jest przydatny w sytuacjach, gdy masz wiele złożonych zapytań współdziałających z kodem Rubiego.
Szyny 4:
Jeśli chcesz użyć zarówno nierównych, jak i równych, możesz użyć:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Jeśli chcesz używać różnych operatorów (np. >
, <
), W pewnym momencie możesz chcieć przełączyć zapisy na następujące:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
W przypadku asocjacji należy zawsze uwzględniać nazwę tabeli w zapytaniu SQL.
Rzeczywiście, jeśli inna tabela ma user_id
kolumnę i dołączysz do obu tabel, będziesz miał niejednoznaczną nazwę kolumny w zapytaniu SQL (tj. Kłopoty).
A więc w twoim przykładzie:
GroupUser.where("groups_users.user_id != ?", me)
Lub bardziej szczegółowe:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Zauważ, że jeśli używasz hasha, nie musisz się tym martwić, ponieważ Railsy zajmują się tym za Ciebie:
GroupUser.where(user: me)
W Rails 4, jak powiedział @ dr4k3, not
dodano metodę zapytania :
GroupUser.where.not(user: me)