2009-09-18 8 views
1

J'utilise ActiveRecord dans Ruby on Rails.Héritage de table ActiveRecord à l'aide de set_table_names

J'ai une table nommée documents (classe Document) et je veux avoir une autre classe data_documents (DataDocument) qui est effectivement la même sauf pour avoir un nom de table différent. En d'autres termes, je veux deux tables avec le même comportement, sauf pour le nom de la table.

class DataDocument < Document 
    #set_table_name "data_documents" 
    self.table_name = "data_documents" 
end 

Ma solution était d'utiliser l'héritage de classe comme ci-dessus, mais il en est résulté déclaration incompatible SQL pour créer l'opération où il y a à la fois la table « documents » et table « data_documents ». Pouvez-vous comprendre pourquoi et comment je peux le faire fonctionner?

>> DataDocument.create(:did=>"dd") 
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'data_documents.did' in 'where clause': SELECT `documents`.id FROM `documents` WHERE (`data_documents`.`did` = BINARY 'dd') LIMIT 1 
     from /Users/lifidea/.gem/ruby/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract_adapter.rb:212:in `log' 
     from /Users/lifidea/.gem/ruby/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/mysql_adapter.rb:320:in `execute' 
     from /Users/lifidea/.gem/ruby/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/mysql_adapter.rb:595:in `select' 
     from /Users/lifidea/.gem/ruby/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all_without_query_cache' 
     from /Users/lifidea/.gem/ruby/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:62:in `select_all' 

Répondre

0

Je ne connais pas les rouages ​​de ActiveRecord assez pour vous dire pourquoi cela ne fonctionne pas, mais la solution est plus simple de déplacer la fonctionnalité de la classe de document et le placer dans un module DocumentMod. Ensuite, incluez ce module dans la classe Document et dans la classe DataDocument qui héritent tous deux d'ActiveRecord.

Exemple:

module DocumentsMod 

    def self.included(klass) 
    klass.extend ClassMethods 
    klass.send(:include, InstanceMethods) 
    end 

module ClassMethods 
    class methods here ... 
end 

module InstanceMethods 
    instance methods here... 
end 
end 

class Document < ActiveRecord::Base 
    include DocumentMod 
end 

class DataDocument < ActiveRecord::Base 
    include DocumentMod 
end 
Questions connexes