Sql Запрос в файле rake не показывает результат - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь выполнить этот запрос SQL в рейке, но он показывает какой-либо результат. Но я попытался запустить этот запрос в Dbeaver, и он прекрасно работает. Первый помещает просто показывает # в терминале, а второй выводит не показывает никакого значения. Пожалуйста, помогите мне найти проблему.

namespace :expense do
  desc "send emails"
  task send_reminder: :environment do
  sql = <<-SQL
  SELECT
    c.id             as corporation_id
  , cs_i.id          as issue_id
  , MAX(i.id)        as expense_id
  , MAX(i."date")    as expense_date
  FROM companies c
  JOIN expenses i on i.corporation_id = c.id
  JOIN issues cs_i on i.issue_id = cs_i.id
  WHERE c.amount > 0 and 
        cs_i.amount > 0 and 
        i."date" < (select (current_date at time zone 'UTC' - interval '1 week')) and i.amount_type = 0 
  GROUP BY c.id, cs_i.id
  SQL
    scope = Expense.connection.execute(sql)
      puts "#{scope}"
    scope.each do |expense|
      puts "#{expense}"
    end    
  end
end

1 Ответ

2 голосов
/ 10 января 2020

Если вы пытаетесь запустить raw SQL, вам, вероятно, не следует использовать connection.execute. См. Документацию по методу execute:

Выполняет оператор SQL в контексте этого соединения и возвращает необработанный результат из адаптера соединения. Примечание: в зависимости от вашего коннектора базы данных, результат, возвращаемый этим методом, может управляться вручную памятью. Попробуйте вместо этого использовать оболочку exec_query.

execute возвращает необработанные результаты из адаптера подключения. например, для PostgreSQL это PG::Result объект.

Вы, вероятно, тоже не хотите использовать exec_query, потому что он также вернет некоторые необработанные результаты.

Из чего Я вижу в вашем коде, вы, вероятно, хотите использовать find_by_sql. Он выполняет запрос и возвращает стандартные объекты ActiveRecord:

namespace :expense do
  desc "send emails"
  task send_reminder: :environment do
    sql = <<-SQL
      sql truncated...
    SQL

    scope = Expense.find_by_sql(sql)
      puts "#{scope}"
    scope.each do |expense|
      puts "#{expense}"
    end    
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...