在这个rails应用程序中,我有一个由控制器调用的方法,它接受站点的活动记录关系和一个筛选器数组,该方法返回关系中具有数组中所有筛选器的任何站点。方法如下:
def filter_sites(sites, filters)
if filters.count > 0
filterable = sites.tag_join
filters.each { |f| sites = sites & filterable.with_tag(f) }
end
return sites
end
以下是使用的范围:
def self.tag_join
joins(:tags).distinct
end
def self.with_tag(tag_id)
where('sites_tags.tag_id = ?',tag_id)
end
这运行正常,但问题是它返回了一个数组。我的问题是;有没有更有效的方法,或者写这个方法并返回一个活动的记录关系?正如后面的代码中所述,需要链接更多的查询。
非常感谢您的帮助。
您可以进行合并。会返回一个array
,但它是一个干净的调用,方便且易于维护。
您可以直接将sql与intersect
一起使用,如下所示:
filters.each do |f|
sql = "(#{sites.to_sql} intersect #{filterable.with_tag(f).to_sql}) as sites"
sites = Site.from(sql)
end
(假设你的类名是Site
)
我不确定随着交叉点数量的增加会如何,但当我只有2个AR关系时,我已经用它来解决代码中的一个类似问题。