1

Rails 2.3.14プロジェクトをに変換しましたRails 3.2.2 から直接派生しないテーブルに問題がありますActiveRecord::Base

次のように定義されたモデルがあります。

class PauaServiceTable < ActiveRecord::Base
    def self.abstract_class?
       true
    end
    ..
    ..
 end

このクラスから派生した多くのクラスがあります。例えば:

 class Lookup < PauaServiceTable
    ...
 end

Rails では、console (3.3.2)直接派生する任意のテーブルをインスタンス化できますActiverecord::Baseが、継承するテーブルPauaServiceTableは次のスタック トレースで失敗します。

Loading development environment (Rails 3.2.2)
ruby-1.8.7-p334 :001 > l=Lookup.new
ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect table name '': SHOW FULL FIELDS FROM ``
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:243:in `query'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:243:in `execute'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `log'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activesupport-3.2.2/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:243:in `execute'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/mysql2_adapter.rb:211:in `execute'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:257:in `execute_and_free'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:424:in `columns'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/connection_adapters/schema_cache.rb:12:in `initialize'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `call'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `default'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `[]'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `columns'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:243:in `column_defaults'
    from /Users/george/.rvm/gems/ruby-1.8.7-p334@rails322/gems/activerecord-3.2.2/lib/active_record/base.rb:479:in `initialize'
    from (irb):1:in `new'
    from (irb):1ruby-1.8.7-p334 :002 > 

このコードは では正常に機能しましRails 2.3.14たが、 に変換すると失敗します3.2.2

4

3 に答える 3

1

@abstract_class = trueセットしてみるclass PauaServiceTable

--- 編集済み

何らかの理由で table_name が空です。次のことを試してください。

class Lookup < PauaServiceTable
  set_table_name 'lookups'
end

次のコードでエラーを再現できます。

class PauaServiceTable < ActiveRecord::Base
  def self.abstract_class?
    true
  end
end

class Lookup < PauaServiceTable
end

ただし、次のように動作します。

class PauaServiceTable < ActiveRecord::Base
  @abstract_class = true
end

class Lookup < PauaServiceTable
end


l= Lookup.new
+----+------------+------------+
| id | created_at | updated_at |
+----+------------+------------+
|    |            |            |
+----+------------+------------+
于 2012-08-30T09:18:31.053 に答える
0

PauaServiceTableLookupモデルは単一のテーブルですか?

その場合、PauaServiceTableモデルにはテーブル名が必要であり、Lookupテーブルは自動的にそれを取得する必要があります。もご覧いただけますSingle Table Inheritance

そうでない場合は、2 つのモデルが 2 つのテーブルに対応していることを意味します。なぜLookup継承する必要があるのPauaServiceTableでしょうか。これら 2 つの間の関係 ( など)has_manyを確立する必要があるかもしれません。has_onemodel

于 2012-08-30T10:17:49.733 に答える