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

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

Вот начало моей рейк-задачи:

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.

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

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

person Joel Cahalan    schedule 23.05.2018    source источник


Ответы (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
person Anand    schedule 23.05.2018
comment
Оказалось, что ошибка была не в операторе select, а в следующей строке: ``` ставит ‹‹-TEXT Идет миграция #{attendees_with_sms_plans.count} участников из Yes! СМС! план получения_sms: истинный атрибут в ТЕКСТе модели посетителя``` - person Joel Cahalan; 23.05.2018

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

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

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

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

DROP EXTENSION count;
CREATE EXTENSION count SCHEMA public;
person Vishal    schedule 23.05.2018