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'"