更新/编辑以澄清:
我在我的博客 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 的标签关联的博客。
换句话说……如果博客 A 与标签 1、标签 3 和标签 4 关联,我只想返回它。
谢谢-wg
最佳答案
无论这是否是处理此问题的有效方法......它有效
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
谢谢
关于ruby-on-rails - 如何使用 Ruby 和 ActiveRecord 构建独占 IN 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6418907/