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

Mysql Rails查询/范围:根据连接模型的属性排除对象,mysql,sql,ruby-on-rails,ruby,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 根据您希望范围链的灵活性,您有两种选择 在范围内使用uniq(注意:这可能会对将此范围与其他范围链接产生负面影响,尤其是在添加更复杂的条件时): scope:unresolved,->

我的模型是这样的:

class Ticket < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :tickets
end

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

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

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

  • 通过
    includes(:tags)
    使用左侧外部联接,而不是
    联接(:tags)

    scope:unresolved,->{includes(:标记)。其中(标记:{name:'unresolved'})}


  • 在你的情况下,double==是一个输入错误吗?@Iwasrobed:因此,如果我有一张带有6个标记的票证,它会在联接表中出现6次。如果我没有
    DISTINCT
    子句,那么该调用将返回5张罚单。。。tags\u ticket表中的每个“条目”都没有链接到名为“unresolved”@iWasRobbed的标记:请重新阅读我的场景,了解细微的区别。我在数据库中有一张有6个标签的票。如果我按照您的建议进行了呼叫,而没有使用
    DISTINCT
    :conditions=>“tags.name!='unresolved'”
    我将获得5次相同的票证,每次出现在连接表中,而不是链接到
    unresolved
    标记时,我都会得到一次。如果不编写非常复杂的自定义SQL查询,我认为这是不可能的。标签可能不是这个钉子最好的锤子。可能更合适的做法是只向票证模型添加一个布尔“已解析”字段,并根据需要将其打开或关闭。当然查询起来会更容易。@JonGarvin你可能是对的,使用布尔字段可能是我最好的选择
    scope :unresolved, :select => "DISTINCT tickets.*", :joins => :tags, :conditions => "tags.name = 'unresolved'"