Rails Одна проблема наследования таблиц

Я пытаюсь настроить наследование одной таблицы в моем приложении Rails для модели User и ее подклассов Member, Subscriber и Staff.

У меня есть файл модели для каждого: user.rb, member.rb и т. Д.

Пользовательская модель определяется: class User < ActiveRecord::Base; end;Я подклассифицировал другие модели как таковые: class Member < User; end; и так далее.

В моей таблице пользователей у меня есть все поля, которые нужны каждому классу, а также поле типа. Теперь, когда я иду к консоли и пытаюсь создать новый экземпляр, скажем, член или подписчик, я получаю следующую ошибку:

TypeError: can't dup NilClass from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2184:in 'dup' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2184:in 'scoped_methods' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2188:in 'current_scoped_methods' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2171:in 'scoped?' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2439:in 'send' from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2439:in 'initialize' from (irb):6:in 'new' from (irb):6

Rails знает, что существуют модели подклассов, потому что в консоли, когда я просто вызываю Member или Subscriber, я получаю возвращенное определение класса.

Я прочитал простую документацию, но я что-то упустил?

6 ответов

Проверьте эту страницу, есть более чем несколько решений этой проблемы (даже в комментариях).

http://strd6.com/2009/04/cant-dup-nilclass-maybe-try-unloadable/

У вас есть столбец типа varchar (строка в ruby)? Попробуйте следующие команды (в новом проекте rails)

class Member < User
end

C:\projects\test\sti>ruby script\generate model user name:string type:string membertype:string
  exists  app/models/
  exists  test/unit/
  exists  test/fixtures/
  create  app/models/user.rb
  create  test/unit/user_test.rb
  create  test/fixtures/users.yml
  create  db/migrate
  create  db/migrate/20091019051506_create_users.rb

C:\projects\test\sti>rake db:migrate
(in C:/projects/test/sti)
==  CreateUsers: migrating ====================================================
-- create_table(:users)
   -> 0.0000s
==  CreateUsers: migrated (0.0000s) ===========================================


C:\projects\test\sti>ruby script\console
Loading development environment (Rails 2.3.4)
>> u = User.new
=> #<User id: nil, name: nil, type: nil, membertype: nil, created_at: nil, updated_at: nil>
>> m = Member.new
=> #<Member id: nil, name: nil, type: "Member", membertype: nil, created_at: nil, updated_at: nil>
>> m.name = 'fred'
=> "fred"
>> m.save
=> true
>> u.name = 'rader'
=> "rader"
>> u.save
=> true
>> User.find :all
=> [#<Member id: 1, name: "fred", type: "Member", membertype: nil, created_at: "2009-10-19 05:17:11", updated_at: "2009-10-19 05:17:11">, #<User id: 2, name: "rader", type: nil, membertype: nil, created_at: "2009-10-19 05:17:24", updated_at: "2009-10-19 05:17:24">]
>>

Я попробовал на своей стороне, начиная с нуля приложения, и это работает

Вот моя модель пользователя (User.rb)

class User < ActiveRecord::Base
end

Моя модель участника (Member.rb)

class Member < User
end

У меня есть один файл миграции для создания моей таблицы пользователей, которая содержит:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

Теперь запускаем консоль:

➜  ./script/console     
Loading development environment (Rails 2.3.4)
>> u = User.new
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>
>> m = Member.new
=> #<Member id: nil, name: nil, created_at: nil, updated_at: nil>
>> m.name="hop"
=> "hop"
>> m.save
=> true

Однако мне не удалось воспроизвести вашу ошибку:(

Я думаю, что проблема в одном из ваших определений модели из-за трассировки стека, которую вы показываете. Если у вас все еще есть проблема, вставьте свой код, и я уверен, что вы получите хороший ответ.

У меня возникла именно эта проблема после того, как я извлек некоторую функциональность в плагин.

Но в моем случае это работало с консоли, поэтому я позаботился о том, чтобы id перезагружался с этой строкой в ​​init.rb ActiveSupport::Dependencies.load_once_paths.delete( File.expand_path(File.dirname(__FILE__))+'/app/models')

Некоторое время назад я столкнулся с чем-то похожим, и этот сайт помог:

http://www.dansketcher.com/2009/05/11/cant-dup-nilclass/

class User < ActiveRecord::Base
  unloadable

  ...
end

Не уверен, почему это происходит, потому что я не мог отследить что-то ненормальное. Я верю, что это была ситуация с ИППП.

Другие вопросы по тегам