2015-06-02 5 views
3

Я в обратном вызове модели (after_save), и одним из атрибутов является тип BigDecimal. Поэтому, когда я изменяю еще один атрибут и проверить грязные атрибуты с changes методом у меня есть это:DirtyAttributes принимают как измененные типы BigDecimal

{"amount"=>[#<BigDecimal:7f86aa3ac900,'-0.4E3',9(18)>, #<BigDecimal:7f86aa3ac838,'-0.4E3',9(18)>], "description"=>["vvvv", "ccc"]} 

Он конкретизирует сумму, как BigDecimal и принимает object_id как часть изменений.

У кого-нибудь есть идея, как избежать такого поведения?

ответ

0

Если в after_save вам нужно проверить, является ли конкретное поле BigDecimal действительно изменилось, вы должны перезагрузить рельсы созданных метод attr_name_changed? (в вашем случае amount_changed?):

def amount_changed? 
    if amount_change.present? 
    amount_change[0].to_f != amount_change[1].to_f 
    end 
end 

Что она делает это сравнивает ранее (amount_change[0]) и после (amount_change[1]) значений в поплавковой форме.

Итак, в after_save обратного вызова вы можете сделать:

after_save :do_something_if_amount_changed 

def do_something_if_amount_changed 
    if amount_changed? 
    do_something 
    end 
end 
Смежные вопросы