Sql 具有和where条件的多个联接

Sql 具有和where条件的多个联接,sql,ruby-on-rails,Sql,Ruby On Rails,我有一个简单的项目标签系统,其结构如下: class Item < ActiveRecord::Base has_many :taggings, :dependent => :destroy has_many :tags, :through => :taggings end class Tagging < ActiveRecord::Base belongs_to :tag belongs_to :item end c

我有一个简单的项目标签系统,其结构如下:

 class Item < ActiveRecord::Base
     has_many :taggings, :dependent => :destroy
     has_many :tags, :through => :taggings
 end

 class Tagging < ActiveRecord::Base
     belongs_to :tag
     belongs_to :item
 end

 class Tag < ActiveRecord::Base
     has_many :taggings, :dependent => :destroy
 end
其中
上下文
标记
对象的
数组

关键是,此作用域生成以下sql:

SELECT items.* FROM items INNER JOIN taggings ON taggings.item_id = items.id 
                          WHERE taggings.tag_id IN (1,2)
假设
context
包含标记1和2

我想获得标记为标记1和标记2的项目。 因此,我假设:

SELECT items.* FROM items INNER JOIN taggings as t1 ON t1.item_id = items.id 
                          INNER JOIN taggings as t2 ON t2.item_id = items.id 
                          WHERE t1.tag_id = 1 AND t2.tag_id = 2
我应该如何在Rails范围内进行翻译? 我需要一个作用域,以便能够链接
类上的各种作用域


谢谢你的帮助

您可以尝试像这样动态构建作用域(并且您不需要
.empty?
检查
注入
):


您可以尝试像这样动态构建作用域(并且您不需要
.empty?
检查
inject
):


伟大的谢谢我试过类似的东西,但没有范围。使用
inject
方法,它简单有效!伟大的谢谢我试过类似的东西,但没有范围。使用
inject
方法,它简单有效!
SELECT items.* FROM items INNER JOIN taggings as t1 ON t1.item_id = items.id 
                          INNER JOIN taggings as t2 ON t2.item_id = items.id 
                          WHERE t1.tag_id = 1 AND t2.tag_id = 2
 scope :tag_context, lambda { |context| 
      context.collect(&:id).inject(self) do |m, id| 
        m.joins("INNER JOIN taggings as t#{id} ON t#{id}.item_id = items.id").
        where("t#{id}.tag_id = ?", id)
      end
 }