Что не так с моими отношениями has_and_belongs_to_many? - PullRequest
1 голос
/ 14 декабря 2011

ИСПРАВЛЕНО: изменение названий моделей в соответствии с соглашениями об именах рельсов

При попытке присоединить навык к пользователю я получаю следующую ошибку:

 irb(main):006:0> user.skills << skill
NameError: uninitialized constant Users::Skill
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/active_r
ecord/base.rb:1341:in `compute_type'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/active_r
ecord/reflection.rb:173:in `klass'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/active_r
ecord/associations/collection_association.rb:146:in `transaction'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/active_r
ecord/associations/collection_association.rb:124:in `concat'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/active_r
ecord/associations/collection_proxy.rb:118:in `<<'
        from (irb):6
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/comman
ds/console.rb:45:in `start'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/comman
ds/console.rb:8:in `start'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/comman
ds.rb:40:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
irb(main):007:0>

Вот мой файл users.rb:

class Users < ActiveRecord::Base

    has_and_belongs_to_many :skills

end

Вот мой файл skill.rb:

class Skills < ActiveRecord::Base

    has_and_belongs_to_many :users

end

А вот мой файл schema.rb:

ActiveRecord::Schema.define(:version => 20111214152402) do

  create_table "skills", :force => true do |t|
    t.integer  "user_id"
    t.string   "description", :null => false
    t.string   "skill_name",  :null => false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "skills", ["user_id"], :name => "index_skills_on_user_id"

  create_table "users", :force => true do |t|
    t.integer  "skill_id"
    t.string   "first_name",   :limit => 25
    t.string   "last_name",    :limit => 50
    t.string   "email",                       :default => ""
    t.string   "password",     :limit => 40
    t.string   "location",     :limit => 100
    t.string   "status"
    t.text     "bio"
    t.string   "question1"
    t.string   "question2"
    t.string   "availability"
    t.string   "image"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "users", ["skill_id"], :name => "index_users_on_skill_id"

  create_table "users_skills", :id => false, :force => true do |t|
    t.integer "user_id"
    t.integer "page_id"
  end

  add_index "users_skills", ["user_id", "page_id"], :name => "index_users_skills_on_user_id_and_page_id"

end

Если бы вы могли помочь, это было бы здорово! Если вам нужно увидеть другие файлы, дайте мне знать.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

user.skills - это массив, поэтому для добавления навыка необходимо выполнить

user.skills << skill

Кроме того, в вашей схеме я заметил, что ваша таблица user_skilsсодержит неверный идентификатор внешнего ключа.Я считаю, что они должны быть user_id и skill_id.

Обновление

Ваша таблица users также выглядит неправильно.Вам не нужен skill_id в вашей таблице пользователей.Точно так же вам не нужен user_id в таблице навыков.

Это небольшая диаграмма того, как должны выглядеть таблицы и атрибуты

users            skills_users         skills
id      ---->    user_id
                 skill_id        ---> id

Обновление 2

Название вашей модели выглядит неправильно.В RoR существует соглашение об использовании единственного названия модели.Users должно быть User.Точно так же для навыков.

3 голосов
/ 14 декабря 2011

Я думаю, проблема в том, что skill является экземпляром Skill, а user.skills ожидает коллекцию.

users.skills = [skill] должно работать, но существуют разные способы создания ассоциаций.1006 *

обн.Дэйв Ньютон прав.Чтобы добавить записи в ассоциацию, вы должны использовать <<

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