Rails 3 `has_one`: через получение неопределенного метода` update_attributes ' - PullRequest
1 голос
/ 10 января 2012

У меня есть модель, где у меня есть Пользователи, Курсы, и я соединяю их через модель ролей.Кажется, все работает хорошо, я могу назначать и извлекать студентов, я могу найти учителя, когда назначаю учителя для курса.Я получаю сообщение об ошибке

Course.last.teacher
# => <# User username: 'schneems' ...>
course = Course.new
course.students = User.last(3)
# => [<# User ... >, <# User ... >, <# User ... >]
course.teacher = User.first
# => NoMethodError: undefined method 'update_attributes' for #<Class:0x007f86b29ee838>

Вот мои основные модели

Пользователи

class User < ActiveRecord::Base
  has_many :roles
  has_many :courses, :through => :roles
end

Роли

class Role < ActiveRecord::Base
  belongs_to :user
  belongs_to :course
end

Курсы

class Course < ActiveRecord::Base
  has_many  :roles
  has_one   :teacher,  :through => :roles, :source => :user, :conditions => ['roles.name = ?', 'teacher']
  has_many  :students, :through => :roles, :source => :user, :conditions => ['roles.name = ?', 'student']
end

Ошибка

Полная трассировка стека выглядит следующим образом:

NoMethodError: undefined method `update_attributes' for #<Class:0x007f86b29ee838>
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/base.rb:1014:in `method_missing'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/associations/association_collection.rb:444:in `block in method_missing'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/base.rb:1127:in `with_scope'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/associations/association_proxy.rb:207:in `with_scope'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/associations/association_collection.rb:440:in `method_missing'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/associations/has_one_through_association.rb:22:in `create_through_record'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/associations/has_one_through_association.rb:10:in `replace'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/activerecord-3.0.9/lib/active_record/associations.rb:1465:in `block in association_accessor_methods'
    from (irb):43
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/railties-3.0.9/lib/rails/commands/console.rb:44:in `start'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/railties-3.0.9/lib/rails/commands/console.rb:8:in `start'
    from /Users/schneems/.rvm/gems/ruby-1.9.2-p290@hourschool/gems/railties-3.0.9/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Кто-нибудь знает, как я могу заставить эту ассоциацию работать, где я могу получить и установить атрибуты учителя дляКонечно, как и ожидалось?Использование Rails 3.0.9

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Если вы запустите этот точный код на Rails 3.1, вы получите это сообщение об ошибке:

ActiveRecord :: HasOneThroughCantAssociateThroughCollection: не может иметь has_one: через ассоциацию 'Course # teacher', где: через Ассоциация «Курс № ролей» представляет собой коллекцию. Укажите has_one или Вместо этого принадлежит принадлежность к параметру: through.

Право ассоциации для использования здесь будет belongs_to, но в этом случае вы не можете поместить это в таблицу ролей.

привет Даниил

0 голосов
/ 10 января 2012

Попробуйте добавить :class_name => "User" к: ассоциации учителей на Course.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...