Подведите итоги поля в ActiveRecord, используя inject в Ruby / Rails - PullRequest
0 голосов
/ 24 августа 2018

Помогите мне понять эту ошибку ActiveRecord, а также, пожалуйста, скажите мне правильный способ написать это.

У меня есть модель оплаты

class Payment < ApplicationRecord

  enum status: %w(success, failed, initialized)

  scope :successful, -> { where(status: :success) }

  def self.find_total_amount_spent(user_id)
    total_amount = 0
    total_amount = self.where(user_id: user_id, status: :success).inject(0) {|amount, payment| amount + payment.amount }
    return total_amount/100.0
  end
end

В методе find_total_amount_spent я хочу получить общую сумму, потраченную пользователем.

Но я получаю эту ошибку

ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: "success" SELECT "payments".* FROM "payments" WHERE "payments"."user_id" = $1 AND "payments"."status" = $2):

Насколько я понимаю, эта ошибка заключается в том, что я не должен указывать символ :success? Но я использовал его в других частях моего приложения, где он работал. Более того, он также используется в enum doc

Это значит, что инжект ожидает, что каждое переданное ему значение будет целым числом? Да, это то, что я думал, основываясь на моем понимании инъекции отсюда

Так что, если инъекция не является правильным методом для использования здесь, не могли бы вы объяснить мне лучший подход и лучший способ прийти к решению?

Большое спасибо.

1 Ответ

0 голосов
/ 24 августа 2018

Ваша проблема не имеет ничего общего с методом inject.Речь идет о вашем определении перечисления.

Это

%w(success, failed, initialized)

оценивается как

["success,", "failed,", "initialized"]

Избавьтесь от этих запятых:)

enum status: %w(success failed initialized)

В любом случае, использование SQL было бы лучше

def self.find_total_amount_spent(user_id)
  (successful.where(user_id: user_id).sum(:amount) || 0) / 100.0
end
...