Я пытался оптимизировать запрос.У меня есть модель с именем Issue
и модель с именем Labels
, они имеют отношение многие ко многим.
Чтобы получить список issues
с labels
с именами, которые соответствуют каждому элементу вданный массив я использую:
Issue.select('issues.id, count(labels.id) as matching_label_count')
.joins(:labels)
.where(labels: { name: [*labels] })
.having("matching_label_count = #{labels.size}")
.group('issues.id')
Используя pry, я вижу, что запрос возвращает Issue::ActiveRecord_Relation
, как и ожидалось, и что он отвечает на ActiveRecord::Calculations
методы.Однако, когда я вызываю count
для результата, я получаю синтаксическую ошибку:
pry(main)> Issue.select('issues.id, count(labels.id) as
matching_label_count').includes(:labels).where(labels: { name: labels
}).having("matching_label_count = #{labels.size}").group('issues.id').count
(0.9ms) SELECT COUNT(DISTINCT issues.id, count(labels.id) as
matching_label_count) AS
count_issues_id_count_labels_id_as_matching_label_count, issues.id,
count(labels.id) as matching_label_count, issues.id AS issues_id FROM "issues"
LEFT OUTER JOIN "tags" ON "tags"."issue_id" = "issues"."id" LEFT OUTER JOIN
"labels" ON "labels"."id" = "tags"."label_id" WHERE "labels"."name" IN (?, ?)
GROUP BY issues.id HAVING (matching_label_count = 2) ORDER BY
"issues"."created_at" DESC [["name", "bug"], ["name", "enhancement"]]
ActiveRecord::StatementInvalid: SQLite3::SQLException: near "as": syntax error:
SELECT COUNT(DISTINCT issues.id, count(labels.id) as matching_label_count) AS
count_issues_id_count_labels_id_as_matching_label_count, issues.id,
count(labels.id) as matching_label_count, issues.id AS issues_id FROM "issues"
LEFT OUTER JOIN "tags" ON "tags"."issue_id" = "issues"."id" LEFT OUTER JOIN
"labels" ON "labels"."id" = "tags"."label_id" WHERE "labels"."name" IN (?, ?)
GROUP BY issues.id HAVING (matching_label_count = 2) ORDER BY
"issues"."created_at" DESC from /Users/Arnould/.rvm/gems/ruby-2.6.0/gems/sqlite3-1
.3.13/lib/sqlite3/database.rb:91:in `initialize' Caused by
SQLite3::SQLException: near "as": syntax error from /Users/Arnould/.rvm/gems/ruby-
2.6.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `initialize'
Тем не менее, она отлично работает с length
.size
возвращает хэш с количеством (label_name_count
) в качестве значения и идентификатором проблемы в качестве ключа.
У меня уже есть полдюжины тестов, вызывающих count
для результата, я хочу знать, почемуон не работает до того, как я рассмотрю их изменение.
Что вызывает сбой #count
и как я могу исправить это в моем запросе, чтобы убедиться, что он работает?