Как получить запрос Active Record, который работает в консоли Rails и работает в грабли?

У меня есть запрос активной записи, который отлично работает в консоли, но не работает, когда я использую его в задаче грабли

Вот начало моей грабли:

namespace :attendees do
  desc "Migrate sms plans to receive_sms attribute for attendees"
  task migrate_sms_plans: :environment do
    attendees_with_sms_plans = Attendee.select('attendees.id, attendees.phone, attendees.local_phone').joins(:plans).where('plans.name = ?', "Yes! SMS!")

Почему оператор select работает в моей консоли rails, но выдает мне следующую ошибку, когда я использую его в задаче rake, и как мне это исправить:

ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR:  function count(integer, character varying, character varying) does not exist
LINE 1: SELECT COUNT(attendees.id, attendees.phone, attendees.local_...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Оказалось, что ошибка была не в операторе выбора, а в следующей строке:

puts <<-TEXT
    Going to migrate #{attendees_with_sms_plans.count} attendees from "Yes! SMS!" plan to receive_sms: true attribute on Attendee Model
TEXT

который я исправил, изменив на:

puts <<-TEXT
    Going to migrate #{attendees_with_sms_plans.to_a.count} attendees from "Yes! SMS!" plan to receive_sms: true attribute on Attendee Model
TEXT

2 ответа

Решение

Хорошо, насколько угадал ошибку: -

attendees_with_sms_plans = Attendee.select('attendees.id, attendees.phone, attendees.local_phone').joins(:plans).where('plans.name = ?', "Yes! SMS!")

attendees_with_sms_plans будут результаты как Attendee::ActiveRecord_Relation

и по вызову attendees_with_sms_plans.count приведет к

ОШИБКА: счетчик функций (целое число, изменяющийся символ, изменяющийся символ) не существует

это означает, что Postgres не поддерживает count() с более чем одним столбцом

Таким образом, решение вы можете использовать size() вместо этого, если count() вот так: -

attendees_with_sms_plans.size

Пожалуйста, проверьте, существует ли счетчик функций с помощью запроса ниже

SELECT n.nspname
FROM pg_extension e
   JOIN pg_namespace n
      ON e.extnamespace = n.oid
WHERE e.extname = 'count';

Если это не на вашем search_pathВаш запрос не найдет функцию.

Чтобы иметь расширение в другой схеме, в следующем примере public удалите его и создайте заново:

DROP EXTENSION count;
CREATE EXTENSION count SCHEMA public;
Другие вопросы по тегам