Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接表活动记录查询_Sql_Ruby On Rails_Activerecord_Jointable - Fatal编程技术网

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
    的记录
    test\u id
    应该是实验室中需要的测试id数组。该条件将作为SQL的
    WHERE
    条件中的
    in
    子句运行
  • 然后它使用分组技巧-它按
    labu id
    分组,只返回组中测试计数与输入测试数相同的记录。也就是说,它只返回至少具有所有给定测试的实验室。