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)
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 modeluGroupUser
, np. W ascope
, możesz użyćarel_table[:user_id]
zamiastGroupUser.arel_table[:user_id]
Kredyt składni Rails 4.0 do odpowiedzi @ jbearden
źródło
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Szyny 4
GroupUser.where.not(user_id: me)
źródło
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:
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.
źródło
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)
źródło
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)
źródło
W Rails 3 nie znam nic bardziej wyszukanego. Jednak nie jestem pewien, czy wiesz, że twój warunek nierówności nie pasuje do wartości NULL (user_id). Jeśli chcesz, będziesz musiał zrobić coś takiego:
GroupUser.where("user_id != ? OR user_id IS NULL", me)
źródło