2013-02-04 61 views
1

我在Rails中具有以下範圍。在rails中有兩個關聯的範圍

scope :with_active_services, Contact.joins(:i_services, :c_services).merge(IService.enabled).merge(CService.enabled) 

我想要實現的是選擇一個已啓用i_services或c_services的聯繫人。聯繫人不一定都有。

我遇到了幾個我無法理解的問題。

範圍在此刻的方式意味着聯繫人需要同時返回一個啓用的i_service和c_service。

當我生成SQL並將WHERE條件中的AND更改爲OR時,我遇到了聯繫人仍需要同時返回c_service和i_service的問題。

我該如何修改以符合我的要求?

謝謝。

+0

不幸的是,Rails不支持任何查詢方法的「OR」謂詞。你可能能夠使用ARel雖然,結帳[這個答案](http://stackoverflow.com/questions/3684311/rails-how-to-chain-scope-queries-with-or-instead-of-and )爲例。不知道是否可以使用現有的範圍。 –

回答

0

你可以用一些奇特的SQL來做到這一點。類似這樣的:

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") 
} 

這將排除未加入任何已啓用服務的任何聯繫人。