2 votes

Disjonction dans ActiveRecord

Est-il possible d'utiliser ActiveRecord named_scope s pour créer une requête avec sql OR clauses ?

Quand j'utilise

Model.scope1.scope2

La requête générée est une conjonction de ces scopes.

1voto

LeoC Points 38

Je réponds car c'était le premier résultat de Google pour "disjonction active des enregistrements".

Avec Rails 5+, vous pouvez faire quelque chose comme :

Model.scope1.or(Model.scope2)

Pour Rails 4.2.3+ il y a un backport aquí .

Eric-Guo a créé un joyau où-ou en ajoutant or la fonctionnalité de rails >= 4.2.3 qui utilise aussi sa gemme.

0voto

Beerlington Points 25012

Ce n'est pas vraiment ce que les scopes nommés ont été conçus pour faire, mais vous pourriez probablement les utiliser avec un peu de code supplémentaire pour obtenir ce dont vous avez besoin.

def combine_scopes(model)
  (model.scope1 + model.scope2).uniq
end

ou permettre de combiner tous les champs d'application

def combine_scopes(model, scope1, scope2)
  (model.send(scope1) + model.send(scope2)).uniq
end

vous pourriez même changer cela pour permettre un nombre quelconque de scopes en utilisant *args

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X