【问题标题】:has_and_belongs_to_many generates NoMethodErrorhas_and_belongs_to_many 生成 NoMethodError
【发布时间】:2016-02-07 14:02:25
【问题描述】:

我在控制台中测试两个表之间的关联时遇到了上述问题。

这是我的模型的样子:

class Team < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  belongs_to :plan
  has_and_belongs_to_many :teams
end

这是我为加入上表而生成的迁移:

class CreateTeamsUsers < ActiveRecord::Migration
 def change
   create_table :teams_users, :id => false do |t|

     t.integer :team_id
     t.integer :user_id
   end

   add_index :teams_users, :team_id
   add_index :teams_users, :user_id    
 end
end

当我尝试在控制台中将用户推送到团队或反之亦然时,我收到以下错误:

NoMethodError: undefined method `name' for nil:NilClass

知道什么会产生这样的问题吗?

谢谢!

更新

这是我的 schema.rb

# encoding: UTF-8
ActiveRecord::Schema.define(version: 20160207132759) do

  create_table "roles", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "teams", force: true do |t|
    t.string   "name"
    t.integer  "value"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "teams_users", id: false, force: true do |t|
    t.integer "team_id"
    t.integer "user_id"
  end

  add_index "teams_users", ["team_id"], name: "index_teams_users_on_team_id"
  add_index "teams_users", ["user_id"], name: "index_teams_users_on_user_id"

  create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "role_id"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end

这是我在控制台中运行的代码:

u = User.new
u.email = "test@test.com"
u.password = "123456789"
u.save
t = Team.new
t.name = "test teat"
t.save

u.teams << t

根据要求;这是错误本身。我还发现在尝试销毁所有用户时遇到同样的错误。

看起来错误在“连接表”中

NoMethodError: undefined method `name' for nil:NilClass
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/has_many_association.rb:79:in `cached_counter_attribute_name'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/has_many_association.rb:75:in `has_cached_counter?'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/has_many_association.rb:83:in `update_counter'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/has_many_through_association.rb:65:in `insert_record'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/collection_association.rb:522:in `block (2 levels) in concat_records'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/collection_association.rb:389:in `add_to_target'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/collection_association.rb:521:in `block in concat_records'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/collection_association.rb:519:in `each'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/collection_association.rb:519:in `concat_records'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/has_many_through_association.rb:42:in `concat_records'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/collection_association.rb:153:in `block in concat'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/associations/collection_association.rb:168:in `block in transaction'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/connection_adapters/abstract/database_statements.rb:211:in `block in transaction'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/connection_adapters/abstract/database_statements.rb:219:in `within_new_transaction'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/connection_adapters/abstract/database_statements.rb:211:in `transaction'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.1.0/lib/active_record/transactions.rb:208:in `transaction'
... 6 levels...
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.1.0/lib/rails/commands/console.rb:9:in `start'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.1.0/lib/rails/commands/commands_tasks.rb:69:in `console'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.1.0/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.1.0/lib/rails/commands.rb:17:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:247:in `require'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:247:in `block in require'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:232:in `load_dependency'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:247:in `require'
        from /home/ubuntu/workspace/criteofootball/bin/rails:9:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `load'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `block in load'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:232:in `load_dependency'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `load'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'

【问题讨论】:

  • “当我尝试在控制台中将用户推送到团队或反之亦然”使用什么代码?
  • 在创建用户并将其保存在变量 u 中并将团队保存在变量 t 中之后,我运行以下命令:u.teams
  • 请发布您的数据库架构和您运行导致错误的确切代码
  • @milesStanfield - 完成(y)
  • 你能把你收到的错误的全部内容也贴出来吗?

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord


【解决方案1】:

我相信这是 ActiveRecord 4.1.0 与 Ruby 2.2.0 一起使用时的一个错误。您可以看到它影响另一个项目here 的示例。该修复程序在 ActiveRecord 4.1.2 中,因此升级应该会为您解决此问题。

【讨论】:

  • 非常感谢@mikej!我将 rails 更新到了 4.1.2 版本,现在该关联正在运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多