Почему postgreSQL хранит десятичное поле в виде хеша BigDecimal? - PullRequest
4 голосов
/ 29 февраля 2012

У меня есть следующая модель / таблица в rails3 / postgreSQL:

create_table "admin_reports", :force => true do |t|
  t.string   "report"
  t.decimal  "result"
  t.string   "result_type"
  t.datetime "created_at"
  t.datetime "updated_at"
end

На производстве AdminReports.result хранит не десятичное число, а хеш:

AdminReport.last

=> #<AdminReport id: 4, report: "dau", result: #<BigDecimal:cbca0f0,'0.8E1',4(8)>, result_type: "percentage", created_at: "2012-02-28 22:05:15", updated_at: "2012-02-28 22:05:15">

Где бы я ожидал увидеть:

AdminReport.last

=> #<AdminReport id: 4, report: "dau", result: 10.10, result_type: "percentage", created_at: "2012-02-28 22:05:15", updated_at: "2012-02-28 22:05:15">

В консоли rails, даже если я пытаюсь установить поле результата вручную, например, так:

@a = AdminReport.last
@a.result = 8.89
@a.save

Он по-прежнему показывает AdminReport.result в качестве хеша BigDecimal.Есть идеи, что здесь происходит?

Спасибо

1 Ответ

6 голосов
/ 29 февраля 2012

Вы используете десятичный столбец:

create_table "admin_reports", :force => true do |t|
  #...
  t.decimal  "result"
  #...
end

Это обычно означает, что вы хотите использовать фиксированное количество десятичных разрядов, поэтому вы, вероятно, захотите указать параметры :precision и :scale какЧто ж.Когда ActiveRecord видит десятичный столбец, он преобразует значение в BigDecimal в Ruby, чтобы вы могли поддерживать желаемое количество десятичных разрядов, находясь в Ruby-land;если бы AR использовал значение с плавающей запятой, то вы столкнулись бы со всеми обычными проблемами с плавающей запятой, и вы могли бы закончить тем, что вытащили одно значение из базы данных и поместили другое значение обратно без намеренного изменения его , используя BigDecimalполностью исключает проблему.

Когда вы видите это:

#<BigDecimal:cbca0f0,'0.8E1',4(8)>

Вы просто видите стандартный вывод inspect из BigDecimal.Если вы используете to_s (или "#{...}"), вы увидите нечто более знакомое.

Так что вам не о чем беспокоиться.Если вам нужна нецелочисленная арифметика, но вы не хотите решать все проблемы с плавающей запятой, тогда десятичный столбец (с :precision и :scale) - правильный выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...