У меня есть этот запрос:
p = Payment.where(:client_id => 1)
Затем только некоторые поля, поэтому я выполняю это:
p.select(:id, :created_at, :amount)
Проблема в том, что каждая сумма в результате имеет вид BigDecimal и не читается. Мне нужно применить функцию to_f
внутри консоли rails, чтобы получить читаемый набор результатов.
Я пробовал map
, вот так:
p.map {|p| p.amount.to_f}
Но он возвращает мне массив только с суммами, а мне нужно, чтобы он был вместе с остальными атрибутами.
Чтобы решить вашу проблему и получить все поля:
p.map { |i| [i.id, i.created_at, i.amount.to_f] }
Также вы можете взглянуть на этот статья. Возможно, вам просто нужен тип float для поля amount
в вашей БД
если вы всегда хотите float
суммы, вы можете установить обратный вызов after_find
class Payment < ActiveRecord::Base
after_find do |payment|
self.amount = self.amount.to_f
end
end
он всегда будет давать вам значение с плавающей запятой, когда вы найдете объект
Пожалуйста, посмотрите на этот Обратный вызов Rails
Мне нужно сделать это внутри консоли rails. По сравнению с решением https://stackoverflow.com/users/5954643/rajkumar-ulaganadhan
, это кажется слишком большим количеством кода для ввода в консоль. Спасибо, в любом случае.
это будет работать и на вашей консоли, я имею в виду, что вы получите тот же результат.
Вы можете попробовать так,
p.map { |item| { id: item.id, created_at: item.created_at, amount: item.amount.to_f}}
Payment.where(:client_id => 1).select([:id,:created_at,:amount]).map {|e| [e.id, e.created_at, e.amount.to_f] }