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

Это работает просто отлично.

Другие вопросы по тегам