Rails查询/范围:根据连接模型的属性排除对象

时间:2011-12-08 03:26:52

标签: 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

我希望有一个范围可以为我提供未标记Tickets的所有不同unresolved(如tag.name != "unresolved"中所述)

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

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

1 个答案:

答案 0 :(得分:0)

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

  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' }) }