【问题标题】:Overwritten model getter executed on save?保存时执行覆盖的模型吸气剂?
【发布时间】:2014-01-24 17:04:12
【问题描述】:
我目前正在修复 Rails 插件中的一个错误,我刚刚找到了导致该问题的方法。我的猜测是,它在某种程度上与在其 ActiveRecord 类Sprint 中被覆盖的 getter 方法之一有关。方法名称是burndown,还有一个属性叫做burndown,它存储了序列化的Hash。
class Sprint < ActiveRecord::Base
serialize :burndown, Hash
...
def touch!
... do stuff ...
self.burndown = nil
self.save!
end
def burndown
... some crazy-ass method ...
end
end
因此,燃尽方法在保存时会以某种方式执行,但我不确定为什么,因为没有为 Sprint 类定义回调。覆盖getter方法是否可能导致这种情况?
【问题讨论】:
标签:
ruby-on-rails
ruby
activerecord
callback
getter
【解决方案1】:
即使您没有任何验证或回调,也会在保存时调用 Getter 方法。
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.13/lib/active_model/dirty.rb:143:in `attribute_change'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.13/lib/active_model/dirty.rb:117:in `block in changes'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.13/lib/active_model/dirty.rb:117:in `map'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.13/lib/active_model/dirty.rb:117:in `changes'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/attribute_methods/dirty.rb:23:in `save'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/transactions.rb:259:in `block (2 levels) in save'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/transactions.rb:208:in `transaction'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/transactions.rb:311:in `with_transaction_returning_status'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/transactions.rb:259:in `block in save'"
"/home/user/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/transactions.rb:270:in `rollback_active_record_state!'"
"/home/usha/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.13/lib/active_record/transactions.rb:258:in `save'"
因此,如果您为某个属性覆盖 getter,请确保它仍然执行其原始功能