2010-11-07 3 views
1

Как я могу массировать атрибуты на уровне модели до того, как активная запись преобразует их в соответствующий тип столбцов?activerecord column type/before_validation

моей конкретной проблемой является то, что пользователь вводит сумму денег в десятичной форме (т.е. $ 15,32) для столбца целочисленного типа, называемого «центы» ... в моей модели, я пытаюсь использовать hook before_validation для возьмите эту сумму и преобразуйте ее в центы (должно быть 1532), однако активная запись уже округлила ее до целого числа, и теперь мое преобразование становится всего лишь 1500.

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

любые предложения?

ответ

2

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

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

    def dollars=(value) 
    cents = dollars * 100 
    end 
    … 
end 
+0

Это правильный путь. Если вы используете #attr_accessible, необходимо добавить #dollars и #cents удалить. –

+0

замечательный. это отлично работает. я никогда не знал, что get & set были такими простыми с рельсами. благодаря! – brewster

0

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

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

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

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

t.decimal :amount, :precisions => 8, :scale => 2 
1

Вы можете использовать крюк 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 ценности, но с точки зрения моделирования объекта некоторые другие предложения здесь есть много, чтобы предложить.

Смежные вопросы