Comment puis-je trouver des enregistrements dans ma base de données dans une condition différente? Je l'ai maintenant, mais y a-t-il une façon sophistiquée de le faire?
GroupUser.where('user_id != ?',me)
Comment puis-je trouver des enregistrements dans ma base de données dans une condition différente? Je l'ai maintenant, mais y a-t-il une façon sophistiquée de le faire?
GroupUser.where('user_id != ?',me)
Réponses:
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 à l'intérieur du modèle GroupUser
lui-même, par exemple, dans a scope
, vous pouvez utiliser à la arel_table[:user_id]
place deGroupUser.arel_table[:user_id]
Crédit de syntaxe Rails 4.0 à la réponse de @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
La seule façon de le rendre plus sophistiqué est avec MetaWhere .
MetaWhere a un cousin plus récent qui s'appelle Squeel qui permet un code comme celui-ci:
GroupUser.where{user_id != me}
Il va sans dire que si c'est le seul refactor que vous allez faire, cela ne vaut pas la peine d'utiliser une gemme et je m'en tiendrai simplement à ce que vous avez. Squeel est utile dans les situations où de nombreuses requêtes complexes interagissent avec le code Ruby.
Rails 4:
Si vous souhaitez utiliser à la fois non é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 souhaitez utiliser une variété d'opérateurs (c'est-à-dire. >
, <
), À un moment donné, vous voudrez peut-être changer les notations comme suit:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
Vous devez toujours inclure le nom de la table dans la requête SQL lorsque vous traitez des associations.
En effet si une autre table a la user_id
colonne et que vous joignez les deux tables, vous aurez un nom de colonne ambigu dans la requête SQL (c'est-à-dire des problèmes).
Donc, dans votre exemple:
GroupUser.where("groups_users.user_id != ?", me)
Ou un peu plus bavard:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Notez que si vous utilisez un hachage, vous n'avez pas à vous en soucier car Rails s'en charge pour vous:
GroupUser.where(user: me)
Dans Rails 4, comme indiqué par @ dr4k3, la méthode de requête not
a été ajoutée:
GroupUser.where.not(user: me)
Dans Rails 3, je ne connais rien de plus sophistiqué. Cependant, je ne sais pas si vous êtes au courant, votre condition non égale ne correspond pas aux valeurs NULL (user_id). Si vous voulez cela, vous devrez faire quelque chose comme ceci:
GroupUser.where("user_id != ? OR user_id IS NULL", me)