【发布时间】:2012-11-05 10:12:30
【问题描述】:
我有一个很常见的habtm 关系:
Photo has_and_belongs_to_many :tags
Tag has_and_belongs_to_many :photos
在我的照片模型中,我有一个“带有标签”的方法,我用它来查找带有给定 tag_id 集的照片。此查询只需要匹配具有所有给定标签的照片,而不考虑是否存在任何其他标签。这是我的方法:
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
这按预期工作。
现在,为了更好地与我正在使用的其他一些库集成,我需要在 Arel 中重新编写它。 (让它成为一个 Arel 节点?不知道你通常怎么称呼它)。
我一直在尝试这个,但老实说我以前从未尝试过使用 Arel,所以我有点迷茫。我一直在控制台中进行试验并尝试过:
t = Photo.arel_table
q = t.join(:tags).on(t[:tags_id].in(array))
Photo.where(q)
但是,(1) 我不认为q 首先是正确的查询,并且(2) 它创建了一个Arel::SelectManager,当传递给 where 调用时会引发Cannot visit Arel::SelectManager。所以,显然我做错了。
更新:只是在这里更具体一点,我希望返回一个 Arel 节点,因为我正在使用一个 gem(ransack),它希望您将 Arel 节点传递给它以用于搜索方法。 Ransack 将把这个 Arel 节点与其他节点链接起来以生成复杂的搜索查询。
Arel 大师能告诉我如何正确地做到这一点吗?
【问题讨论】:
-
这不是答案,但试试 Squeel! AR 的默认设置在 imo 中相当糟糕,虽然 AREL 功能强大得多,但它的文档记录很糟糕,而且对开发人员不太友好。 squeel gem 非常适合做这样的事情!
标签: ruby-on-rails activerecord arel