Method_missing woes

Hey all, I’m working on a gem that provides archiving functionality to
AR
models and am trying to allow use of the original’s methods on the
archived
copies through method missing but I’m getting some really weird errors
and
can’t for the life of me figure out what’s going on.

my test class structure:
class SomeModel < AR::Base
class Archive < AR::Base
include ArchiveMethods
end
end

module ArchiveMethods
def self.included(base)
base.class_eval do
extend ArchiveClassMethods
protected :get_klass,:get_klass_name,:get_klass_instance_methods
end
end

def method_missing(method,*args,&block)
  if get_klass_instance_methods.include?(method.to_s)
    instance = get_klass.new
    instance.id = self.id
    instance_attribute_names = instance.attribute_names
    attrs = self.attributes.select{|k,v|

instance_attribute_names.include?(k.to_s)}
instance.attributes= attrs,false
instance.send(method,*args,&block)
else
super(method,*args,&block)
end
end

def get_klass
  @klass ||= Kernel.const_get(get_klass_name)
end

def get_klass_name
  @klass_name ||= self.class.to_s.split("::").first
end

def get_klass_instance_methods
  @klass_instance_methods ||= get_klass.instance_methods(false)
end

module ArchiveClassMethods;end

end

The error I’m getting is happening in an unrelated test while trying to
insert test data into the database:

NoMethodError: undefined method name' for nil:NilClass /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/to_sql.rb:57:invisit_Arel_Nodes_InsertStatement’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/to_sql.rb:56:in
map' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/to_sql.rb:56:invisit_Arel_Nodes_InsertStatement’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/visitor.rb:15:in
send' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/visitor.rb:15:invisit’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/visitor.rb:5:in
accept' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/to_sql.rb:19:inaccept’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:110:in
with_connection' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/visitors/to_sql.rb:17:inaccept’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/tree_manager.rb:20:in
to_sql' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/arel-2.0.7/lib/arel/select_manager.rb:191:ininsert’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/relation.rb:14:in
__send__' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/relation.rb:14:ininsert’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/persistence.rb:270:in
create' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/timestamp.rb:47:increate’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/callbacks.rb:281:in
create' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:413:in_run_create_callbacks’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/callbacks.rb:281:in
create' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/persistence.rb:246:increate_or_update’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/callbacks.rb:277:in
create_or_update' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:413:in_run_save_callbacks’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/callbacks.rb:277:in
create_or_update' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/persistence.rb:39:insave’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/validations.rb:43:in
save' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/attribute_methods/dirty.rb:21:insave’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/transactions.rb:237:in
save' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/transactions.rb:289:inwith_transaction_returning_status’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in
transaction' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/transactions.rb:204:intransaction’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/transactions.rb:287:in
with_transaction_returning_status' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/transactions.rb:237:insave’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/transactions.rb:248:in
rollback_active_record_state!' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/transactions.rb:236:insave’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/activerecord-3.0.3/lib/active_record/base.rb:498:in
create' ./test/test_helper.rb:66:ininsert_models’
./test/test_base.rb:55:in __bind_1297269651_315691' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:400:incall’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:400:in
run_current_setup_blocks' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:399:ineach’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:399:in
run_current_setup_blocks' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:391:inrun_all_setup_blocks’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:395:in
run_parent_setup_blocks' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:390:inrun_all_setup_blocks’
/Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:395:in
run_parent_setup_blocks' /Users/tylerpickett/.rvm/gems/ruby-1.8.7-p330@archivist/gems/thoughtbot-shoulda-2.11.1/lib/shoulda/context.rb:379:intest: The archiving functionality when restoring from the archive with
conditions should restore with original id. ’

The only bit of my code there is a method in test_helper:
def insert_models
SomeModel.create(:first_name=>“George”,
:last_name=>“Bush”,
:random_array=>[1,2,3,4],
:some_hash=>{:external_id=>15,
:dog_name=>“Fluffy”})
SomeModel.create(:first_name=>“Bill”,
:last_name=>“Clinton”,
:random_array=>[1,2,3,4],
:some_hash=>{:external_id=>15,
:dog_name=>“Fluffy”})
end

What’s really confusing to me is that these errors persist when running
the
full test suit after I comment out the method_missing def but go away
when I
run just the tests that are failing and stay gone until I put method
missing
back in.

Tyler Pickett
[email protected]

fortes fortuna adiuvat