Странная ошибка заполнения данных

#ruby-on-rails #ruby #decimal

#ruby-on-rails #ruby #десятичная

Вопрос:

У меня есть класс с именем Order, в котором есть поля total и commission_amount, которые оба являются десятичными числами. В файле seeds.rb я присваиваю оба поля 100.00 как есть (без кавычек). Когда я вхожу в консоль rails и набираю Order.all, я вижу, что заказ, созданный файлом seeds, имеет размер комиссии 100.00 , но общая сумма указана как 0.0 .
Я пытался использовать консоль rails для присвоения ей разных чисел, причем как общая сумма, так и сумма комиссии являются десятичными атрибутами precision: 10, scale: 2 . Я пытался использовать конструктор BigDecimal для присвоения значений в файле seeds, и у меня нет никаких проверок для атрибута total. Довольно озадачен тем, что должно быть тривиальной проблемой. Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: вот соответствующие примеры кода

 # the migration
class CreateOrders < ActiveRecord::Migration
  def change
    create_table :orders do |t|
      # ...
      t.decimal :total, precision: 10, scale: 2
      t.decimal :commission_amount, precision: 10, scale: 2
    end
  end
end

# the seeds file

# Order SEEDING
# --------------
create_records([
    {
      # ...
      total: 100.00,
      commission_amount: 100.00
    }
  ], Order)
 

Комментарии:

1. вы успешно пытались присвоить значения через консоль или это тоже не сработало? Каково ваше полное определение столбца (включая значения по умолчанию)? можете ли вы вставить соответствующую часть вашего файла seeds.rb?

2. назначение через консоль работает для commission_amount, но не для total, и я только что обновил примеры кода

3. Это опечатка в вашем опубликованном коде миграции или ваш реальный код тоже неверен?

4. Что такое order.total.class (вызывается в экземпляре order)?

5. @davidicus что означает «назначение не работает для total»? Вы получаете сообщение об ошибке или оно остается нулевым? Можете ли вы также показать свою модель? У вас, вероятно, есть метод, который называется total defined в нем? Вы проверили фактическое значение в БД?

Ответ №1:

Странные ошибки сопоставления значений в ActiveRecord часто вызываются конфликтами имен. ActiveRecord определяет методы setter и getter для всех полей в таблице базы данных модели, а ruby позволяет вам автоматически переопределять их в вашем определении класса.

Всегда рекомендуется убедиться, что не использовалось зарезервированное слово для имени столбца (классическими кандидатами являются «тип», «объект», «класс»), не вызывать столбец так же, как связанный объект, и, наконец, не определять метод с тем же именемимя в качестве столбца в базе данных.

В вашем случае проверьте, определили ли вы метод, вызываемый total в определении вашей модели.