Как получить запрос Active Record, который работает в консоли Rails и работает в грабли? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть запрос активной записи, который отлично работает в консоли, но не работает, когда я использую его в задаче 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

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

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

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
0 голосов
/ 23 мая 2018

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

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;
...