2009-10-16 7 views
4

J'essaye de configurer l'héritage de table unique dans mon application de Rails pour un modèle d'utilisateur et ses sous-catégories membres, abonné et personnel.Rails Problème d'héritage de table unique

Je dispose d'un fichier de modèle pour chaque: user.rb, member.rb, etc

Le modèle utilisateur est défini: class User < ActiveRecord::Base; end; Je subclassed les autres modèles en tant que tels: class Member < User; end; et ainsi de suite.

Dans mon tableau d'utilisateurs, j'ai tous les champs dont chaque classe a besoin plus le champ de type. Maintenant, quand je vais à la console et essayer de créer une nouvelle instance de dire membre ou abonné i l'erreur suivante:

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 sais que les modèles sous-classes sont là parce que dans la console quand je l'appelle simplement membre ou Abonné, j'obtiens la définition de classe retournée. J'ai lu la documentation simple, mais il me manque quelque chose?

+0

Pouvez-vous fournir l'instruction qui déclenche cette erreur? – EmFi

+0

Veuillez également indiquer votre migration qui crée la table des utilisateurs. – Jared

Répondre

1

J'ai essayé de mon côté à partir d'une application scratch et il fonctionne

Voici mon modèle d'utilisateur (User.rb)

class User < ActiveRecord::Base 
end 

Mon modèle membre (Member.rb)

class Member < User 
end 

J'ai un fichier de migration pour créer ma table d'utilisateurs qui contient:

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 

maintenant le lancement de la console:

➜ ./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 

Cependant, je ne l'ai pas réussi à reproduire votre erreur :(

+2

Il manque à votre migration l'attribut ': type' dont l'IST a besoin pour fonctionner correctement. –

1

Avez-vous une colonne de type de type varchar (chaîne en rubis)? Essayez

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

Vous devez ajouter une colonne spéciale 'type' qui est ce que ActiveRecord utilise pour suivre les modèles sous-classés dans une seule table. –

0

les commandes suivantes (dans un nouveau projet de rails) Je pense que le problème est dans l'une des définitions de modèle en raison de la trace de la pile vous montrer. Si vous avez toujours un problème, passez votre code, et je suis sûr que vous aurez une bonne réponse.

0

J'ai exactement ce problème après avoir extrait certaines fonctionnalités d'un plugin.

Mais je mon cas, il a travaillé à partir de la console, donc je me suis assuré id rechargées, avec cette ligne dans init.rb ActiveSupport::Dependencies.load_once_paths.delete( File.expand_path(File.dirname(__FILE__))+'/app/models')

0

je suis tombé sur quelque chose de similaire un certain temps et ce site a permis:

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

class User < ActiveRecord::Base 
    unloadable 

    ... 
end 

Je ne sais pas pourquoi cela se produit que je ne pouvais pas retrouver quelque chose d'anormal. Je crois que c'était une situation d'IST cependant.