ruby on rails добавляет функциональность к изменению свойств модели
В моей модели rails у меня есть десятичное свойство с именем Employee_wcb. Я хотел бы, чтобы, когда был изменен Employer_wcb, грязный бит был установлен в true. Я хотел бы переопределить метод сеттера Employer_wcb. Любой способ сделать это (в частности, с помощью метапрограммирования)?
2 ответа
Решение
Так что на самом деле, в Rails v2.1, это было включено в Rails. Посмотрите документацию для ActiveRecord:: Dirty. В итоге:
# Create a new Thing model instance;
# Dirty bit should be unset...
t = Thing.new
t.changed? # => false
t.employer_wcb_changed? # => false
# Now set the attribute and note the dirty bits.
t.employer_wcb = 0.525
t.changed? # => true
t.employer_wcb_changed? # => true
t.id_changed? # => false
# The dirty bit goes away when you save changes.
t.save
t.changed? # => false
t.employer_wcb_changed? # => false
Если вы не хотите использовать встроенную функциональность "грязных битов" Rail (скажем, вы хотите переопределить по другим причинам), вы не можете использовать метод псевдонима (см. Мои комментарии к записи Стива выше). Однако вы можете использовать вызовы super, чтобы заставить его работать.
def employer_wcb=(val)
# Set the dirty bit to true
dirty = true
super val
end
Это работает просто отлично.