[英]Join Table Active Record Query
我有一个连接表lab_tests
,它存储特定实验室具有lab_id
和test_id
模式的lab_id
test_id
。
我想获得一个实验室列表,其中包含所有传递到参数中的测试。
我目前有以下范围 -
scope :test_filter, lambda {|test_id|
return nil if test_id.blank?
where(:test_id => test_id)
}
但这给了我一份至少有一个测试的实验室列表。 如何获取包含给定参数中所有测试的实验室列表?
您可以使用 GROUP BY 和 HAVING 来使用这个技巧。 如果您为所有想要的test_id
筛选关联表test_id
其lab_id
,那么如果分组记录的数量与测试数量相同,则您可以确定实验室包含所有这些测试(它可能包括其他一些测试)测试虽然但我想你不介意)。
所以,尝试这样的事情:
# 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)
}
笔记:
test_ids
为空,作用域将返回一个none
作用域。 这是一个比返回nil
更好的方法,因为none
是正常的可链接作用域,可以像其他作用域一样使用(链接nil
会抛出异常)。test_ids
记录。 test_ids
应该是实验室需要的一组测试 ID。 该条件将作为 SQL 的WHERE
条件中的IN
子句运行。lab_id
分组并仅返回组中测试数与输入测试数相同的那些记录。 即它只返回那些至少具有所有给定测试的实验室。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.