cnandreu
cnandreu

Reputation: 5111

User has many roles through assignments

I want to be able to assign multiple roles to every user and get them back with something like User.first.roles, but I'm lost, how would you do it using rails console? What am I doing wrong in my models?

u = User.first

User Load (0.1ms)  SELECT "users".* FROM "users" LIMIT 1
 => #<User id: 18 [...]>

1.9.3-p194 :004 > u.roles
NameError: uninitialized constant User::Assignment
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/inheritance.rb:119:in `compute_type'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/reflection.rb:172:in `klass'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/reflection.rb:385:in `block in source_reflection'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/reflection.rb:385:in `collect'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/reflection.rb:385:in `source_reflection'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/reflection.rb:508:in `check_validity!'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/associations/association.rb:26:in `initialize'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/associations/collection_association.rb:24:in `initialize'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/associations/has_many_through_association.rb:10:in `initialize'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/associations.rb:157:in `new'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/associations.rb:157:in `association'
    from [path]/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/associations/builder/association.rb:44:in `block in define_readers'
    from (irb):4
    from [path]/ruby-1.9.3-p194/gems/railties-3.2.3/lib/rails/commands/console.rb:47:in `start'
    from [path]/ruby-1.9.3-p194/gems/railties-3.2.3/lib/rails/commands/console.rb:8:in `start'
    from [path]/ruby-1.9.3-p194/gems/railties-3.2.3/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

models/user.rb

class User < ActiveRecord::Base
 attr_accessible :name, :email, :password, :password_confirmation, :role_id
 has_many :assignments
 has_many :roles, through: :assignments
 #more code...
end

models/role.rb

class Role < ActiveRecord::Base
 attr_accessible :name
 has_many :assignments
 has_many :users, through: :assignments
end

models/assignments.rb

class Assignments < ActiveRecord::Base
 attr_accessible :role_id, :user_id
 belongs_to :user
 belongs_to :role
end

schema.rb: http://cl.ly/323n1t0Q1t390y1M2S0E

Upvotes: 1

Views: 778

Answers (1)

abhas
abhas

Reputation: 5213

change the name of model file models/assignments.rb to models/assignment.rb and its class name from class Assignments to class Assignment. Model names should be singular its a rails convention. Therefore when you ran u.roles it is looking for Assignment not Assignments.

Upvotes: 3

Related Questions