mysql - Rails 查询/范围 : exclude objects according to attribute of joined model

标签 mysql sql ruby-on-rails ruby

我的模型是这样的:

class Ticket < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :tickets
end

我想要一个范围,为我提供所有未标记为 unresolved 的不同 Tickets(如 tag.name != "unresolved")

我该怎么做呢?例如,如果一张票有 6 个标签(其中一个是 unresolved),我只想返回该票的 1 个实例,而不是范围内的 5 个。我设法做了相反的事情(所有 Tickets 标记为 unresolved):

scope :unresolved, :select => "DISTINCT tickets.*", :joins => :tags, :conditions => "tags.name = 'unresolved'"

最佳答案

根据您希望范围链接的灵 active ,您有两种选择。

  1. 使用 uniq在范围内(注意:这可能会对将此范围与其他范围链接产生负面影响,尤其是在添加更复杂的条件时):

    scope :unresolved, -> { joins(:tags).where(tags: { name: 'unresolved' }).uniq }

  2. 通过 includes(:tags) 使用 LEFT OUTER 连接而不是 joins(:tags) 使用的默认 INNER 连接

    scope :unresolved, -> { includes(:tags).where(tags: { name: 'unresolved' }) }

关于mysql - Rails 查询/范围 : exclude objects according to attribute of joined model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8425779/

相关文章:

Mysql:在同一张表上进行子查询更新?

mysql - 为什么查询只显示第一行?

mysql - 在mysql查询中添加和减去总和列

ruby-on-rails - 使用 MongoMapper 创建用于编辑嵌入文档的表单

ruby-on-rails - 如何在 Controller 中使用方法 'truncate'?

mysql - 仅当字段已填充且与其他字段值相同时才计数

mysql - 使用 Mysql 中的 update 语句将日期更改为天

php - MySQL 查询获取数组不起作用

mysql - 按 ASC 排序返回奇怪的结果

css - 如何在页脚前引入一个空格