Как получить запрос 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;