Pergunta

No meu modelo rails, eu tenho uma propriedade decimal chamado employer_wcb. Eu gostaria que, quando employer_wcb foi alterado, um pouco sujo foi definido como verdadeiro. Eu gostaria de substituir o método employer_wcb setter. Qualquer maneira de fazer isso (em particular usando metaprogramming)?

Foi útil?

Solução

Então, na verdade, a partir de Rails v2.1, este foi cozido em Rails. Dê uma olhada na para ActiveRecord :: sujo . Em resumo:

# 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

Outras dicas

Se você não quiser usar ferroviário é construído em termos de funcionalidade pouco suja (digamos que você deseja substituir por outras razões), você não pode usar o método apelido (ver meus comentários sobre a entrada de Steve acima). No entanto, pode utilizar chamadas de super para fazê-lo funcionar.

  def employer_wcb=(val)
    # Set the dirty bit to true
    dirty = true
    super val
  end

Isso funciona muito bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top