使用Rails的多对多关系时,“NameError:uninitialized constant”

时间:2009-07-08 11:21:00

标签: ruby-on-rails activerecord many-to-many

我有以下型号:

class Person < ActiveRecord::Base
  has_many :accounts, :through => :account_holders 
  has_many :account_holders
end

class AccountHolder < ActiveRecord::Base
  belongs_to :account
  belongs_to :people
end

class Account < ActiveRecord::Base
  has_many :people, :through => :account_holders 
  has_many :account_holders
end

但是,在使用此关系时遇到问题。 Account.first.account_holders工作正常,但Account.first.people返回:

NameError: uninitialized constant Account::People
    from /Users/neil/workspace/xx/vendor/rails/activesupport/lib/active_support/dependencies.rb:105:in `const_missing'
    from /Users/neil/workspace/xx/vendor/rails/activerecord/lib/active_record/base.rb:2204:in `compute_type'
    from /Users/neil/workspace/xx/vendor/rails/activesupport/lib/active_support/core_ext/kernel/reporting.rb:11:in `silence_warnings'
    from /Users/neil/workspace/xx/vendor/rails/activerecord/lib/active_record/base.rb:2200:in `compute_type'
    from /Users/neil/workspace/xx/vendor/rails/activerecord/lib/active_record/reflection.rb:156:in `send'
    from /Users/neil/workspace/xx/vendor/rails/activerecord/lib/active_record/reflection.rb:156:in `klass'
    from /Users/neil/workspace/xx/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb:73:in `find_target'
    from /Users/neil/workspace/xx/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:353:in `load_target'
    from /Users/neil/workspace/xx/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:139:in `inspect'

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

belongs_to需要单数形式。在AccountHolder

belongs_to :person

答案 1 :(得分:1)

我遇到了同样的问题,就像上面的答案所示,当我将联结表中的belongs_to符号值更改为单数时(在名称末尾删除了's'),它得到修复。

在我的练习中,我有:

guy.rb

class Guy < ActiveRecord::Base
  attr_accessible :name
  has_many :junctions
  has_many :girls, through: :junctions
end

girl.rb

class Girl < ActiveRecord::Base
  attr_accessible :name
  has_many :junctions
  has_many :guys, through: :junctions 
end

junction.rb

class Junction < ActiveRecord::Base
  attr_accessible :girl_id, :guy_id
  belongs_to :girl   # girls wouldn't work - needs to be singular
  belongs_to :guy    # guys wouldn't work - needs to be singular
end

然后这种多对多关系有效......