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 )
Dans Rails 3.x
Pour raccourcir la longueur, vous pouvez stocker
GroupUser.arel_table
dans une variable ou si vous utilisez à l'intérieur du modèleGroupUser
lui-même, par exemple, dans ascope
, vous pouvez utiliser à laarel_table[:user_id]
place deGroupUser.arel_table[:user_id]
Crédit de syntaxe Rails 4.0 à la réponse de @ jbearden
la source
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Rails 4
la source
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:
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.
la source
Rails 4:
Si vous souhaitez utiliser à la fois non égal et égal, vous pouvez utiliser:
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:la source
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:
Ou un peu plus bavard:
Notez que si vous utilisez un hachage, vous n'avez pas à vous en soucier car Rails s'en charge pour vous:
Dans Rails 4, comme indiqué par @ dr4k3, la méthode de requête
not
a été ajoutée:la source
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:
la source