2016-02-15 2 views
0

У меня есть две модели Ruby on Rails Farm и Harvest. Ферма принадлежит к урожаю. Вот модели:Почему изменяется масштаб BigDecimal при доступе через ассоциацию?

class Farm < ActiveRecord::Base 
    acts_as_singleton 
    belongs_to :harvest 
    validates :harvest, presence: true, allow_blank: true 
    serialize :harvest_time, Tod::TimeOfDay 
    validates :harvest_time, presence: true, allow_blank: true 
    validates :hash_rate, presence: true 
    validates_with HashRateValidator 
end 

class Harvest < ActiveRecord::Base 
    belongs_to :user 
    validates :user, presence: true 
    validates :date, presence: true 
    validates :amount, presence: true 
    validates :identifier, presence: true 
    validates :amount, numericality: { :greater_than => 0 } 
end 

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

@harvest = Harvest.new(
     :date => DateTime.now, 
     :amount => amount, 
     :identifier => new_identifier, 
     :user => current_user, 
     :assigned => false 
) 

if @harvest.save 
    Farm.instance.update_attributes(:harvest => @harvest) 
    byebug 

Странных редеют является то, что значения количества урожая анс суммы от урожая, назначенного на ферму не совпадают после этого:

(byebug) Farm.instance.harvest.amount 
435.435 

(byebug) @harvest.amount 
435.435345343 

(byebug) Farm.instance.harvest.id 
12 

(byebug) @harvest.id 
12 

количество десятичного suposed иметь шкалу до 8 и точностью до 6 (от миграции), вот соответствующая часть файла schema.rb:

create_table "harvests", force: :cascade do |t| 
    t.datetime "date" 
    t.decimal "amount",       precision: 6, scale: 8 
    t.integer "identifier" 
    t.datetime "created_at",                null: false 
    t.datetime "updated_at",                null: false 
    ... 
    end 

Итак, что здесь происходит? Сумма должна быть точно такой же!

ответ

0

Я понял. Масштаб и точность не имели смысла. Точность - это количество цифр в сумме BigDecimal, масштаб - это количество тех цифр, которые отображаются справа от десятичной точки. Поскольку точность была установлена ​​на 6 шкале, не удалось разместить 8 цифр после десятичной точки. Поэтому, когда число прибыло из базы данных, оно было усечено, когда оно появилось из памяти, у него были все его цифры после десятичной точки. Я исправил его, установив точность до 18 и масштабируя до 8, что означает 18 цифр в общей сложности и 8 из тех, которые появляются справа от десятичных точек.

Sqlite допускает некогерентную точность => 6 и масштаб => 8. Postgres этого не сделал.