2010-06-09 5 views
2

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

Lorsque j'utilise

Model.scope1.scope2 

requête générée est conjonction de ces champs d'application.

Répondre

0

Ce n'est pas vraiment ce que les étendues nommées ont été conçues pour faire, mais vous pourriez probablement les utiliser avec du code supplémentaire pour obtenir ce dont vous avez besoin.

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

ou permettent des champs d'application à combiner

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

vous pouvez même changer cela pour permettre un certain nombre de champs en utilisant * args

+0

Votre méthode génère plusieurs requêtes SQL. C'est facile de cette façon;) – samuil

+0

Personnellement, je ne le ferais pas de cette façon, je ne faisais que suggérer une méthode qui utilisait des portées nommées. Si c'était moi, je n'aurais qu'une seule portée nommée utilisant OR dans le paramètre conditions. Pas aussi flexible si vous avez plusieurs étendues nommées, mais si la performance est un facteur à prendre en considération, vous ne voudrez peut-être pas la requête supplémentaire. –

Questions connexes