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