Наследование таблицы ActiveRecord с использованием set_table_names - PullRequest
1 голос
/ 18 сентября 2009

Я использую ActiveRecord в Ruby on Rails.

У меня есть таблица с именем Documents (класс документа), и я хочу иметь другой класс data_documents (DataDocument) таблицы, который фактически такой же, за исключением того, что у него другое имя таблицы. Другими словами, я хочу две таблицы с одинаковым поведением, кроме имени таблицы.

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

Мое решение состояло в том, чтобы использовать наследование классов, как описано выше, но это привело к несогласованному оператору SQL для операции создания, в которой есть как таблица 'Documents', так и таблица 'data_documents'. Вы можете понять, почему и как я могу заставить это работать?

>> 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'

1 Ответ

0 голосов
/ 18 сентября 2009

Я недостаточно знаю внутреннюю работу ActiveRecord, чтобы сказать вам, почему это не работает, но самое простое решение - переместить функциональность из класса Document и поместить его в модуль DocumentMod. Затем включите этот модуль в класс Document и в класс DataDocument, которые оба наследуются от ActiveRecord.

Пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...