2009-10-16 117 views
4

我想在用户模型及其子类成员,订阅者和工作人员的Rails应用程序中设置单表继承。Rails单表继承问题

我为每个模型文件: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知道子模型存在,因为当我只需拨打会员控制台或订阅者,我得到返回的类定义。

我读过简单的文档,但我必须错过什么?

+0

您能否提供触发此错误的语句? – EmFi 2009-10-16 19:01:53

+0

也请提供您的迁移创建用户表。 – Jared 2009-10-17 02:20:55

回答

1

我想在我身边从一个从头开始的应用和它的作品

这里是我的用户模型(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 

但是我没能重现你的错误:(

+2

您的迁移缺少STI需要正常工作的':type'属性。 – 2009-11-01 03:42:12

1

你有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">] 
>> 
+0

您需要添加一个特殊的“类型”列,它是ActiveRecord用来跟踪单个表中的子类模型的类型。 – 2010-01-16 14:17:58

0

我想这个问题是因为你表现出的堆栈跟踪你的模型定义之一。如果您仍然遇到问题,请点击您的代码,我相信您会得到一个很好的答案。

0

在我将一些功能提取到插件之后,我确实讨论了这个问题。

但我我的情况下,它从控制台的工作,所以我确信ID重新加载,这条线在init.rb ActiveSupport::Dependencies.load_once_paths.delete( File.expand_path(File.dirname(__FILE__))+'/app/models')

0

我遇到了类似一会儿回来的东西,这个网站帮助:

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

class User < ActiveRecord::Base 
    unloadable 

    ... 
end 

不知道为什么发生这种情况,因为我无法追查什么异常。但我确实认为这是一种性病情况。