更新/编辑澄清:
我在博客AR对象中定义了以下内容
scope :with_tag_tokens, lambda {|name_tokens|
joins(:tags).where(:tags => {:name_token => name_tokens}) unless name_tokens.empty?
}
以下查询将返回所有具有“name_token”属性等于1或3或5的标签的博客(如果我当然传入[1,3,5])...我想知道是否有一种方法可以构建一个类似的查询,只返回仅与“name_tokens”为1 AND 3 AND 5的标签相关联的博客。
换句话说......如果它与标记1以及标记3和标记4相关联,我只想返回博客A.
谢谢-wg
答案 0 :(得分:1)
这是否是处理此问题的有效方式......它有效
tags = ['rails', 'ruby']
BlogEntry.joins(:tags).where(:tags => {:name_token => tags}).group(BlogEntry.column_names.map {|c| BlogEntry.table_name + "." + c }.join(',')).having("count(#{BlogEntry.table_name + '.id'}) =#{tags.count}")
你会怎么想?有没有更好的办法?也许在这里采用直接的SQL是正确的方法......如果是这样的话,我肯定有兴趣从别人那里听到好的或坏的。
*更新* 以下是人们感兴趣的sql的样子:
SELECT \"blog_entries\".*
FROM \"blog_entries\"
INNER JOIN \"blog_entries_tags\" ON \"blog_entries_tags\".\"blog_entry_id\" = \"blog_entries\".\"id\"
INNER JOIN \"tags\" ON \"tags\".\"id\" = \"blog_entries_tags\".\"tag_id\"
WHERE \"tags\".\"name_token\" IN ('grace', 'gratitude')
GROUP BY id
HAVING count(blog_entries.id) =2
ORDER BY published_at DESC, title, created_at DESC
由于