使用Active-Record搜索关联数据集具有特定值的数据集?

时间:2014-07-17 13:03:43

标签: sql ruby-on-rails database activerecord

我目前正试图在我的数据集中进行“复杂”搜索。 我想找到与特定工具相关联的每个数据集。 我试过这样的事情:

Dataset.find_by_sql("SELECT * FROM datasets, tools, sectors, products  WHERE datasets.id = sectors.dataset_id AND sectors.product_id = products.id AND products.tool_id = tools.id AND tools.name = '#{toolname}'")

这很有效。但是我们想要定义查询的范围,以便能够在以后组合它们中的一些:Dataset.find_by_toolname(“foo”)。find_by_sector_name(“foo2”)。所以我为此定义了一个范围:

scope :with_tool_name, ->(toolname) {find_by_sql("SELECT * FROM datasets, tools, sectors, products  WHERE datasets.id = sectors.dataset_id AND sectors.product_id = products.id AND products.tool_id = tools.id AND tools.name = '#{toolname}'")}

这里的问题是这个查询将返回一个数组,而不是一个ActiveRecord-Relation,这样我就无法对第一个结果的结果做另一个范围请求。

那么我如何获取某些关联模型的属性具有特定值的数据呢?然后对此应用另一个范围?

以下是数据模型的样子:

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用activerecord-method连接()。并且每个连接的结果可以与方法merge()混合在一起。这里有一个小例子来获取一个tool_id的所有数据集。

Dataset.joins(:sectors).merge(Sector.joins(:product)).merge(Product.joins(:tool).where(:tool_id => 1))