繁体   English   中英

联接表活动记录查询

[英]Join Table Active Record Query

我有一个连接表lab_tests ,它存储特定实验室具有lab_idtest_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_idlab_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会抛出异常)。
  • 您尚未指定示波器所在的位置,因此我认为 Lab 模型可能是一个好地方 - 这样示波器至少会返回带有给定测试的 Labs。
  • 范围加入关联表并仅过滤那些具有test_ids记录。 test_ids应该是实验室需要的一组测试 ID。 该条件将作为 SQL 的WHERE条件中的IN子句运行。
  • 然后它使用分组技巧 - 它按lab_id分组并仅返回组中测试数与输入测试数相同的那些记录。 即它只返回那些至少具有所有给定测试的实验室。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM