Rails ActiveRecord 查询与方法过滤器相结合 - 如何重写它?
Rails ActiveRecord query combined with a method filter - how to rewrite this?
我有以下代码,它会导致对 PodAdmins 的一个查询,然后是 x 个后续查询,一个用于数据库中的每个 Pod!
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>
= 这将是 Pod class.
的 is_active?
方法
我知道我可以编写 sql 并传递它,但我想在这个逻辑中 access/use Pod class 上的 'is_active?' 方法 - 因为如果那样方法更改(可能会更改)我也不想重构它。
我确定一定有一些简单的方法可以实现我想要的并且只有一个查询命中数据库?
为了完整性,这里是 '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
试一试:
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,....)
我有以下代码,它会导致对 PodAdmins 的一个查询,然后是 x 个后续查询,一个用于数据库中的每个 Pod!
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>
= 这将是 Pod class.
is_active?
方法
我知道我可以编写 sql 并传递它,但我想在这个逻辑中 access/use Pod class 上的 'is_active?' 方法 - 因为如果那样方法更改(可能会更改)我也不想重构它。
我确定一定有一些简单的方法可以实现我想要的并且只有一个查询命中数据库?
为了完整性,这里是 '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
试一试:
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,....)