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
}