我目前正试图在我的数据集中进行“复杂”搜索。 我想找到与特定工具相关联的每个数据集。 我试过这样的事情:
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,这样我就无法对第一个结果的结果做另一个范围请求。
那么我如何获取某些关联模型的属性具有特定值的数据呢?然后对此应用另一个范围?
以下是数据模型的样子:
答案 0 :(得分:1)
您可以使用activerecord-method连接()。并且每个连接的结果可以与方法merge()混合在一起。这里有一个小例子来获取一个tool_id的所有数据集。
Dataset.joins(:sectors).merge(Sector.joins(:product)).merge(Product.joins(:tool).where(:tool_id => 1))