我的模特看起来像这样:
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'"
答案 0 :(得分:0)
根据您希望范围链的灵活性,您有两种选择。
在范围内使用uniq
(注意:这可能会对其他人链接此范围产生负面影响,尤其是在添加更复杂的条件时):
scope :unresolved, -> { joins(:tags).where(tags: { name: 'unresolved' }).uniq }
通过includes(:tags)
使用LEFT OUTER加入,而不是joins(:tags)
使用的INNER加入默认
scope :unresolved, -> { includes(:tags).where(tags: { name: 'unresolved' }) }