0

Je voulais faire une association polymorphique dans mon projet, donc je suis le guide des rails pour le faire mais j'ai: NameError: uninitialized constant DashboardAssignment::Assignable erreur.Polymorphics in Rails 'constante non initialisée' erreur

Modèles:

DashboardAssignment:

class DashboardAssignment < ActiveRecord::Base 
    belongs_to :dashboard 
    belongs_to :assignable, polymorphic: true 

    validates :dashboard, presence: true 
    validates :assignable, presence: true, uniqueness: { :scope => :dashboard } 
end 

utilisateur:

class User < ActiveRecord::Base 
    has_many :dashboard_assignments, as: :assignable 
    has_many :dashboards, through: :dashboard_assignments 
end 

Groupe:

class Group < ActiveRecord::Base 
    has_one :dashboard_assignment, as: :assignable 
    has_many :laboratories_assignments, as: :lab_assignable 
end 

Tableau de bord :

class Dashboard < ActiveRecord::Base 
    has_one :building 
    has_many :dashboard_assignments 
    has_many :users, through: :dashboard_assignments, as: :assignable 
end 

Dans DashboardAssignment fichier Migration J'ai:

t.references :assignable, null: false, polymorphic: true, index: true 

Lorsque je tente de créer un nouveau DashboardAssignment par DashboardAssignment.create(assignable: u)u = User.find(1) il me donne l'erreur:

NameError: uninitialized constant DashboardAssignment::Assignable 
    from P:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-4.2.6/lib/active_record/inheritance.rb:158:in `compute_type' ... 

Am I faire quelque chose de mal?

Ma version rails est 4.2.6

+0

Qu'est-ce que l'erreur vous dit est qu'il n'y a pas d'attribut ou une association appelée assignable sur la classe DashboardAssignment. Pouvez-vous s'il vous plaît poster votre modèle de tableau de bord s'il vous plaît? –

+0

ok. ajouté modèle de tableau de bord – Levvy

+0

Je suis tout à fait sûr, votre problème existe en raison de: has_many: les utilisateurs, à travers:: dashboard_assignments, comme:: – bpieck

Répondre

1

Vous devez utiliser source au lieu de as dans une association through

class Dashboard < ActiveRecord::Base 
    has_one :building 
    has_many :dashboard_assignments 
    has_many :users, through: :dashboard_assignments, source: :assignable 
end 

Je voudrais mettre en garde bien que cela pourrait vous donner assignables qui sont de classe Group. La meilleure façon de contourner ce problème est en ajoutant une condition à un has_many pour dashboard_assignments qui vous permet de filtrer uniquement pour dashboard_assignments qui ont assignable_type = 'User':

class Dashboard < ActiveRecord::Base 
    has_one :building 
    has_many :user_dashboard_assignments, -> { where(assignable_type: 'User') }, class_name: 'DashboardAssignment' 
    has_many :users, through: :user_dashboard_assignments, source: :assignable 
end 
+0

J'ai essayé de changer ces lignes, mais la même erreur se produit toujours. Mon projet est open source ici: https://github.com/GRM-dev/IMP/tree/Polimorphic sur la branche polimorphe – Levvy

+0

Ahhh c'était probablement mon erreur :) Dans DashboardAssignment j'avais une ligne 'validates: assignable, presence: true, unicité: {: scope =>: dashboard} ' Lorsque je l'ai supprimé et que j'ai changé' as: 'en' source: 'tout semble fonctionner correctement. Ajout également 'source_type:" User "' à cette ligne. – Levvy