Rails 带参数的活动记录调用?

Rails active record call with parameters?

我的应用程序使用 Searchkick 和 Elasticsearch 来 return 从你的搜索中聚合(如类别细分等),我用它来构建过滤器。

现在我可以快速得到一个像这样的数组:

[[1, 47], [1, 119], [1, 174], [1, 207], [1, 217], [1, 225], [1, 239], [1, 241], [1, 271], [1, 293], [1, 295]]

第一个数字是计数,第二个是记录的id

我想做这样的事情:

"SELECT CONCAT(name, ' (', , ')') AS label, id  FROM projects WHERE id = "

所以我最终得到了一个新数组,例如:

[["Project A (1)", 47], ["Project B (1)", 119], ... ]

然后我可以在 select 中直接使用它。我不想/不能通过第二组查询来重新创建这些计数。

我可以遍历数组并进行单独的原始 SQL 调用,但这看起来很乱。我认为这是某种混乱的 .map 调用,但我无法理解。

我可以获得两个单独的数组(id 和 count),然后快速从 BD 中获取名称数组:

['Project A', 'Project B', ...]

一旦我有了它,有没有一种快速的方法可以将三个数组合并为我需要的选项格式?

是的,正如您已经建议的那样,有一个使用 map 的简单解决方案。

假设您已经将来自 ElasticSearch 的 ID 和计数存储在以下数组中:

count_and_id = [[1, 47], [1, 119], [1, 174], [1, 207], [1, 217], [1, 225], [1, 239], [1, 241], [1, 271], [1, 293], [1, 295]]

然后,正如您所描述的,您 pluck 项目名称并将它们放入 Hash 以便更快地查找:

relevant_ids = count_and_id.map(&:second)
project_names = Project.where(id: relevant_ids).pluck(:id, :name).to_h # {47 => "Project A", 119 => "Project B", ...}

为了最终格式化数组,可以使用map,建议:

result = count_and_id.map do |count,id|
  description = "#{project_names[id]} (#{count})"
  [description, id]
end # [["Project A (1)", 47], ["Project B (1)", 119], ...]