Sql 联接表活动记录查询
我有一个联接表Sql 联接表活动记录查询,sql,ruby-on-rails,activerecord,jointable,Sql,Ruby On Rails,Activerecord,Jointable,我有一个联接表lab\u tests,它存储了特定实验室使用lab\u id和test\u id模式的测试列表 我想得到一个包含所有测试的实验室列表,这些测试都被传递到参数中 我目前的工作范围如下: scope :test_filter, lambda {|test_id| return nil if test_id.blank? where(:test_id => test_id) } 但这给了我一个至少有一次测试的实验室列表。如何获得包含给定参数中所有测试的实验室列表
lab\u tests
,它存储了特定实验室使用lab\u id
和test\u id
模式的测试列表
我想得到一个包含所有测试的实验室列表,这些测试都被传递到参数中
我目前的工作范围如下:
scope :test_filter, lambda {|test_id|
return nil if test_id.blank?
where(:test_id => test_id)
}
但这给了我一个至少有一次测试的实验室列表。如何获得包含给定参数中所有测试的实验室列表?您可以使用GROUP BY和HAVING的技巧。如果您过滤关联表中所有想要的
test\u id
s并按lab\u id
对其进行分组,那么如果分组记录的数量与测试的数量相同,您可以确定lab包含所有这些测试(虽然它可能包括一些其他测试,但我想您不会介意)
那么,试试这样的方法:
# Lab model:
scope :with_tests, -> (test_ids) {
return Lab.none if test_ids.blank?
joins(:lab_tests).
where(lab_tests: { test_id: test_ids }).
group(:lab_id).
having("count(*) = ?", test_ids.count)
}
注:
- 如果测试ID为空,则作用域将返回a。这是比返回
更好的方法,因为nil
是一个正常的可链接作用域,可以与其他作用域以相同的方式使用(链接none
会引发异常)nil
- 您还没有指定作用域所在的位置,所以我认为实验室模型可能是一个好地方——这样,作用域将返回至少包含给定测试的实验室
- 作用域加入关联表,并仅过滤具有
的记录test\u id
应该是实验室中需要的测试id数组。该条件将作为SQL的test\u id
条件中的WHERE
子句运行in
- 然后它使用分组技巧-它按
分组,只返回组中测试计数与输入测试数相同的记录。也就是说,它只返回至少具有所有给定测试的实验室。labu id