тип столбца activerecord / before_validation - PullRequest
1 голос
/ 08 ноября 2010

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

Моя конкретная проблема заключается в следующем ... пользователь вводит сумму денег в десятичной форме (т. Е. $ 15,32) для столбца целочисленного типа с именем 'cents' ... в моей модели я пытаюсь использовать хук before_validation для захвата эту сумму и преобразовать ее в центы (должно быть 1532), однако активная запись уже округлила ее до целого числа, и теперь мое преобразование становится просто 1500.

Я могу конвертировать количество в параметрах на уровне контроллера, но я бы предпочел контролировать это в модели ради сохранения СУХОГО.

есть предложения?

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010

Я полагаю, что вы вообще не выставляете свой атрибут cents. Используйте пару атрибутов getter / setter под названием dollars и вычислите вашу cents из этого.

class Model < ActiveRecord::Base
   …
   def dollars
     cents / 100.0
   end

   def dollars=(value)
     cents = dollars * 100
   end
   …
end
1 голос
/ 05 февраля 2011

Вы можете использовать ловушку before_validation вместе со значением before_type_cast. Вы можете сделать что-то вроде этого:

class Model < ActiveRecord::Base
   before_validation :convert_dollars_to_cents

   def convert_dollars_to_cents
       cents = cents_before_type_cast * 100
   end
   …
end

Я думаю, что стоит упомянуть, так как многие люди не знают о значениях before_type_cast, но с точки зрения объектного моделирования некоторые другие предложения здесь могут предложить многое.

0 голосов
/ 08 ноября 2010

Я не знаю, что люди используют для управления деньгами, но я использовал плагин rails_money, и он позаботился о большей части конверсий, поэтому я бы сначала проверил это.

http://www.railslodge.com/plugins/461-rails-money

Но для решения вашей проблемы вы хотите сохранить атрибут money как float или decimal для типа столбца.

Я видел, что большинство людей делают что-то подобное.

t.decimal :amount, :precisions => 8, :scale => 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...