我有一个非常普遍的habtm关系:
Photo has_and_belongs_to_many :tags
Tag has_and_belongs_to_many :photos
Run Code Online (Sandbox Code Playgroud)
在我的Photo模型中,我有一个"带标签"的方法,我用它来查找用一组给定的tag_ids标记的照片.此查询只需匹配具有所有给定标记的照片,但无需考虑是否存在任何其他标记.这是我的方法:
def self.with_terms( array )
select('distinct photos.*').joins(:tags).where('tags.id' => array).group("photos." + self.column_names.join(', photos.')).having("count(*) = #{array.size}")
end
Run Code Online (Sandbox Code Playgroud)
这按预期工作.
现在,为了更好地与我正在使用的其他库集成,我需要在Arel中重写它.(让它成为Arel节点?,不确定你通常称之为什么).
我一直在尝试这个,但说实话我以前从未尝试过使用过Arel,所以我有点失落.我一直在试验控制台并尝试:
t = Photo.arel_table
q = t.join(:tags).on(t[:tags_id].in(array))
Photo.where(q)
Run Code Online (Sandbox Code Playgroud)
但是,(1)我认为q首先不是正确的查询,并且(2)它创建了一个Arel::SelectManager,当传递给调用的地方时Cannot visit Arel::SelectManager.所以,显然我做错了.
更新:只是为了在这里特别具体,我希望返回一个Arel节点,因为我正在使用一个gem(ransack),希望你传递它的搜索方法的Arel节点.Ransack将此Arel节点与其他节点链接在一起,以生成复杂的搜索查询.
Arel大师可以告诉我这是怎么做的吗?