2016-05-25 36 views
0

我有以下代碼,它將導致PodAdmins的一個查詢,然後x查詢,數據庫中的每個Pod都有一個查詢!Rails的ActiveRecord查詢結合方法過濾器 - 如何重寫這個?

pod_admins = PodAdmin.where("pod_id IS NOT null") 

pod_admins.select{|pa| pa if pa.pod.is_active?}.each ... 

我相信一定有辦法讓數據庫在一個查詢做到這一點,如:

SELECT * FROM 
POD_ADMINS 
    WHERE POD_ID IN 
    (SELECT ID FROM PODS WHERE <condition>) 

<condition> =這將是豆莢類的is_active?方法。

我知道我可以寫入SQL並傳遞,但我想訪問/使用'is_active?'方法在這個邏輯上的Pod類 - 因爲如果該方法改變(它可能會),我不想也重構這個。

我確定必須有一些簡單的方法來實現我想要的,只有一個查詢命中數據庫?

爲了完整,這裏是'is_active?'方法:

def is_active? 
    return true if (self.inactive_date.blank? || self.days_left > 0) 
    return false 
    end 

這取決於:

def days_left 
    days = self.inactive_date.strftime("%j").to_i - Date.today.strftime("%j").to_i unless self.inactive_date.nil? 
    return 0 if days < 0 
    return days 
    end 

編輯

型號:

class Pod 
    has_one :pod_admin 
    has_many :parents 
end 

class PodAdmin 
    belongs_to :pod 
end 
+0

駕駛室你把你的模型?我的意思是協會 – Thorin

+0

你可以使用包括像PodAdmin.includes(:pod).where(「pod_id IS NOT null」) – Thorin

+0

@Thorin我添加了模型 – rmcsharry

回答

1

試試看:

pod_admins = PodAdmin.includes(:pod).where("pod_id IS NOT null").select{|pa| pa if pa.pod.is_active?} 

只會產生兩個SQL這樣的:

SELECT "pod_admins".* FROM "pod_admins" WHERE ("pod_id IS NOT null") 

SELECT "pods".* FROM "pods" WHERE "pods"."id" IN (x, y, z,....)