ruby-on-rails - 如何使用 Ruby 和 ActiveRecord 构建独占 IN 查询?

标签 ruby-on-rails ruby activerecord

更新/编辑以澄清:

我在我的博客 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/

相关文章:

ruby - 为什么问号在 Ruby 中被解释为 "z"

ruby-on-rails - 为什么where()。first_or_create仅在RSpec中生成不正确的SQL?

ruby-on-rails - Rails DELETE http 方法呈现页面

ruby-on-rails - 在 Rails Web 应用程序中进行简单单元测试的好方法是什么?

ruby-on-rails - 在 Ruby on Rails 中运行每个测试需要多长时间?

ruby - 为什么 `Symbol#match` 的行为与 `String#match` 和 `Regexp#match` 不同?

ruby-on-rails - 如何在 rails 6 应用程序中使用来自 Gem 的 js 文件

ruby-on-rails - Bundler 将我的 gem 放在我的项目目录中

ruby-on-rails - 如何在rails中使用动态绑定(bind)执行原始更新sql

ruby-on-rails - 在 Rails 中设置两个模型之间的一对一和一对多关系