Rails ActiveRecord查询结合方法过滤器 - 如何重写这个?

时间:2016-05-25 19:54:59

标签: ruby-on-rails activerecord arel

我有以下代码,这导致一个查询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

1 个答案:

答案 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,....)