web-dev-qa-db-fra.com

Rails Le modèle trouve où égal

Comment trouver des enregistrements dans ma base de données dans des conditions différentes? Je l'ai maintenant, mais y a-t-il une façon élégante de le faire?

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

Dans Rails 4.x (Voir http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions) )

GroupUser.where.not(user_id: me)

Dans Rails 3.x

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

Pour raccourcir la longueur, vous pouvez stocker GroupUser.arel_table dans une variable ou si vous utilisez le modèle GroupUser lui-même, par exemple, dans un scope, vous pouvez utiliser arel_table[:user_id] au lieu de GroupUser.arel_table[:user_id]

Crédit de syntaxe Rails 4.0 à réponse de @ jbearden

225
Vikrant Chaudhary

Rails 4

GroupUser.where.not(user_id: me)
38
jbearden

La seule façon dont vous pouvez avoir le goût de l'amateur est d'utiliser MetaWhere .

MetaWhere a un nouveau cousin qui s'appelle Squeel qui autorise un code comme celui-ci:

GroupUser.where{user_id != me}

Il va sans dire que si c’est le seul refactor que vous ferez, il ne vaut pas la peine d’utiliser un bijou et j’en resterais juste à ce que vous avez obtenu. Squeel est utile dans les situations où de nombreuses requêtes complexes interagissent avec le code Ruby.

26
Jakub Hampl

Rails 4:

Si vous voulez utiliser les deux pas égal et égal, vous pouvez utiliser:

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

Si vous voulez utiliser plusieurs opérateurs (ie. >, <), vous voudrez peut-être changer les notations comme suit:

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

Ce que vous avez est à peu près un bon Rails 3 façons de le faire je pense.

15
Spyros

Vous devez toujours inclure le nom de la table dans la requête SQL lorsque vous utilisez des associations.

En effet si une autre table a le user_id column et que vous joignez les deux tables, vous aurez un nom de colonne ambigu dans la requête SQL (problèmes).

Donc, dans votre exemple:

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

Ou un peu plus verbeux:

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

Notez que si vous utilisez un hachage, vous n'avez pas à vous en préoccuper car Rails s'en charge pour vous:

GroupUser.where(user: me)

Dans Rails 4, comme l'a dit @ dr4k3, la méthode de requête not a été ajoutée:

GroupUser.where.not(user: me)
8
Damien

Dans Rails 3, je ne connais rien de plus sophistiqué. Cependant, je ne suis pas sûr que vous soyez au courant, votre condition non égale ne correspond pas aux valeurs (utilisateur_id) NULL. Si vous voulez que, vous devrez faire quelque chose comme ça:

GroupUser.where("user_id != ? OR user_id IS NULL", me)
6
konyak