获取两个活动记录关系rails的交集



在这个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关系时,我已经用它来解决代码中的一个类似问题。

最新更新