Мне нужно хранить в Rails-модели PackageType объем и вес. У меня есть две (связанные) проблемы:
- Значения не могут быть целыми числами. Например, это может быть 0,5 кг. Но я хочу избежать ошибок округления, связанных с плавающей точкой: после добавления / умножения / деления я не хочу рисковать, получая 1,00000001 кг (в основном по причинам бухгалтерского учета).
- У меня возникает желание сохранить этоони как маленькая единица, где они всегда будут целыми числами: граммы и см3. (Я знаю, что мои пакеты не будут меньше 1 г / 1 см3). Но это не очень удобно для пользователя: мои пользователи должны скорее видеть и вводить значения в L (дм3) и в кг.
Решение, которое я нашел на данный момент, состоит в том, чтобы иметь столбцы weight_g и volume_cl:
rails g migration AddVolumeAndWeigthToPackageTypes volume_cm3:integer weight_g:integer
И есть в моей модели несколько методов для преобразования между единицами:
class PackageType < ApplicationRecord
…
def volume_dm3
volume_cm3.to_f / 1000
end
def volume_dm3=(vol)
self.volume_cm3 = (vol*1000).to_i
end
def weight_kg
weight_g.to_f / 1000
end
def weight_kg=(w)
self.weight_g = (w*1000).to_i
end
end
Это работает, но не правильно, и поднимает нескольковопросы:
- Почему в моделях Rails я могу получить доступ к атрибуту модели без обозначения @? Как будто я могу читать то, что хранится, просто вызывая volume_cm3, а не self.volume_cm3 или @ volume_cm3. И почему я могу читать, не ставя себя впереди, но мне нужно уточнить для себя self.volume_cm3, чтобы написать это?
- Это правильный способ сделать это, или я должен просто отказаться от этого преобразования и сохранить непосредственно килограммы и л. как десятичные дроби? Я пока не собираюсь отображать пользователей в других единицах, кг и л - единственные единицы, которые я буду использовать. Я испытываю искушение просто использовать десятичные дроби, кг и L.
- Когда вам нужно хранить что-то, в котором есть единица измерения, каков рекомендуемый способ именования столбцов базы данных и атрибута модели? Это «объем» (предполагаемая единица измерения), «объем_дм3», «объем_ин_дм3»?