issue with the object cache

Hi,

I am getting a method_missing error when I run my application in the production environment unless I set config.cache_classes = false in config/environments/production.rb. This happens in Rails 2.2.2 but not in Rails 2.1.0. The method that is missing is one I used to have before I edited by hand the migration that creates the table associated with the object (I know you are discouraged to do this, but I had started with a very simple model and thought it would be cleaner to have the bulk of the data defined in the first migration). I wonder if this has anything to do with the issue.

To be more specific, I changed this

  def self.up     create_table :clients do |t|       t.string :name, :null=>false       t.text :office_address       t.text :home_address

      t.timestamps     end     add_index(:clients, :name, :unique=>true)   end

into

  def self.up     create_table :clients do |t|       t.string :last_name, :null=>false       t.string :first_name, :null=>false       t.text :office_address       t.text :home_address       <bunch of other fields>

      t.timestamps     end     add_index(:clients, :last_name, :unique=>true)   end

I then ran "rake db:migrate VERSION=0" and then "rake db:migrate"

All worked fine in both development and production environments in Rails 2.1.0, but broke in Rails 2.2.2/production with the message "undefined method `name' for #<Client:0xb72d361c>"

From what I can tell, with the object cache enabled, Rails thinks that the Client object still has a method called name (which it used to have). I wonder how persistent is the object cache (I'd imagine not across server restarts) or if the source of this problem is elsewhere.

Any help will be appreciated,

Luis

All worked fine in both development and production environments in Rails 2.1.0, but broke in Rails 2.2.2/production with the message "undefined method `name' for #<Client:0xb72d361c>"

When does this error occur - what's the stack trace ?

Fred

This happens when trying to save the Client object, here is the stack trace

/usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/attribute_methods.rb:260:in `method_missing' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/validations.rb:398:in `send' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/validations.rb:398:in `validates_each' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/validations.rb:397:in `each' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/validations.rb:397:in `validates_each' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:182:in `call' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:182:in `evaluate_method' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:166:in `call' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:90:in `run' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:90:in `each' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:90:in `send' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:90:in `run' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activesupport-2.2.2/lib/active_support/callbacks.rb:277:in `run_callbacks' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/validations.rb:1029:in `valid_without_callbacks?' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/callbacks.rb:286:in `valid?' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/validations.rb:1008:in `save_without_dirty' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/dirty.rb:79:in `save_without_transactions' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:179:in `send' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:179:in `with_transaction_returning_status' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/connection_adapters/ postgresql_adapter.rb:550:in `transaction' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:129:in `transaction' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:138:in `transaction' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:178:in `with_transaction_returning_status' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:146:in `save' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:158:in `rollback_active_record_state!' /usr/local/encap/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/ activerecord-2.2.2/lib/active_record/transactions.rb:146:in `save' app/models/client.rb:12:in `save' app/controllers/clients_controller.rb:14:in `create'

This happens when trying to save the Client object, here is the stack trace

Looks like you still have a validation against name.

Fred

That seems to be the case, but why? Why does it happen only with cache_classes = true? It seems to me that the cache is not being flushed...

thanks,

Luis

The problem could be that rails caches the model schema when the server starts.

Try to do a Model.reset_column_information where Model is the name of your model.

This happens when trying to save the Client object, here is the
stack trace

Looks like you still have a validation against name.

Fred

That seems to be the case, but why? Why does it happen only with cache_classes = true? It seems to me that the cache is not being flushed...

Without seeing any code it's hard to say. One extra thing that happens
in 2.2 when cache_classes is true is that models are loaded when the
server starts up (previously they were loaded on demand). This can
mean that faulty code that was never loaded before is now loaded.

Fred

Well, it turns out that I had left in app/models a renamed version of the previous Client model file (client--previous.rb) which was throwing things off. After I removed the file all worked as expected.

Thanks all for your help, and sorry for the red herring.

Luis