2013-02-04 4 views
1

J'ai la portée suivante dans Rails. Ce que j'essaie de réaliser est de sélectionner un contact qui a activé i_services ou c_services. Les contacts n'ont pas nécessairement les deux.Portée avec deux associations dans les rails

J'ai rencontré quelques problèmes que je n'arrive pas à comprendre.

La portée actuelle de l'oscilloscope signifie qu'un contact doit avoir à la fois un i_service activé et un c_service à renvoyer.

Lorsque je prends l'instruction SQL générée et que la condition AND dans la condition WHERE est définie sur OU, je rencontre le problème selon lequel un contact doit toujours avoir à la fois un service c_service et un service i_service à renvoyer. Comment puis-je modifier cela pour répondre à mes exigences?

Merci.

+0

Malheureusement, Rails ne prend pas en charge les prédicats "OR" avec l'une des méthodes de requête. Vous pourriez être en mesure d'utiliser ARel pour cela, la caisse [cette réponse] (http://stackoverflow.com/questions/3684311/rails-how-to-chain-scope-queries-with-or-instead-of-and) à titre d'exemple. Vous ne savez pas s'il est possible d'utiliser des portées existantes. –

Répondre

0

Vous pouvez le faire avec une touche de fantaisie SQL. Quelque chose comme ceci:

scope :with_active_services ->() { 
    joins("LEFT JOIN i_services ON contact.id = i_services.contact_id AND i_services.enabled") 
    .joins("LEFT JOIN c_services ON contact.id = c_services.contact_id AND c_services.enabled") 
    .group(:id) 
    .where("(count(i_services.id) + count(c_services.id)) > 0") 
} 

Ceci exclura tout contact qui n'a rejoint aucun service activé.