我有以下代码,这导致一个查询PodAdmins,然后x查询后面的查询,一个用于数据库中的每个Pod!
//Use ACE OleDb if xlsx extention
else if (extension.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase))
{
constr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;IMEX=1;HDR=YES\"", FilePath);
}
我确信必须有办法让数据库在一个查询中执行此操作,例如:
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>)
=这将是Pod类的<condition>
方法。
我知道我可以编写sql并传递但我想访问/使用&#39; is_active?&#39;这个逻辑中Pod类的方法 - 因为如果该方法改变(可能会),我也不想重构它。
我确信必须有一些简单的方法来实现我想要的,只有一个查询命中数据库?
为了完整起见,这里是&#39; is_active?&#39;方法:
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
答案 0 :(得分: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,....)