【问题标题】:Whats wrong with my has_and_belongs_to_many relationships?我的 has_and_belongs_to_many 关系有什么问题?
【发布时间】:2011-12-14 19:23:52
【问题描述】:

修正者: 更改模型名称以匹配 Rails 命名约定

当我尝试将技能加入用户时出现以下错误:

 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

这是我的技能.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

如果你能帮忙那就太好了!如果您需要查看其他文件,请告诉我。

【问题讨论】:

  • 你是怎么得到复数型号名称的?那帮不上忙。在任何情况下,habtm 关系都需要skills &lt;&lt; skill——您不会将技能列表设置为单个技能,而是添加技能。不过,在这种情况下,我会对类命名感到紧张。可能是错的。
  • 使用由 has_and_belongs_to_many 宏生成的 collection&lt;&lt;(object, ...) 方法,所以在你的情况下它是 user.skills &lt;&lt; skill
  • 我尝试了user.skills &lt;&lt; skill,但仍然出现错误
  • @Mike 你可以尝试使用标准的 Rails 类名,以防万一吗?设置一个新项目以按照正常的 Rails 方式进行完整性检查可能是最简单的。
  • 命名约定解决了我的问题。现在我在尝试查找“skills_users”表而不是“users_skills”时遇到了问题,不知道为什么会发生这种情况。我只是要迁移一个新的skills_users 表并删除users_skills 我仍然很好奇为什么我需要这样做。谢谢

标签: mysql ruby-on-rails ruby rubygems


【解决方案1】:

user.skills 是一个数组,所以要添加技能,你需要这样做

user.skills &lt;&lt; skill

此外,在您的架构上,我注意到您的 user_skils 表包含错误的外键 ID。我相信他们应该是user_idskill_id

更新

您的users 表看起来也有问题。您的用户表中不需要 Skill_id。同样,您的技能表中也不需要 user_id。

这是表格和属性应该是什么样子的小图

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

更新 2

您的型号名称看起来不对。使用单数模型名称是 RoR 中的惯例。 Users 应该是 User。同样,对于技能。

【讨论】:

    【解决方案2】:

    我认为,问题在于 skill 是 Skill 的一个实例,而 user.skills 需要一个集合。

    users.skills = [skill] 应该可以工作,但是有不同的方法可以创建关联。

    更新。戴夫牛顿是对的。要将记录添加到关联中,您应该使用 &lt;&lt;

    【讨论】:

      猜你喜欢
      • 2019-11-24
      • 2013-07-19
      • 1970-01-01
      • 2013-08-17
      • 2015-01-09
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多