【问题标题】:ActiveRecord has_many association NameError: uninitialized constantActiveRecord has_many 关联 NameError: uninitialized constant
【发布时间】:2015-05-07 13:14:49
【问题描述】:

我有两个模型

class DistributionResults < ActiveRecord::Base
  belongs_to :eqadistribution
  belongs_to :meter
  belongs_to :user

class User < ActiveRecord::Base
  belongs_to :prime_contractor
  has_many :distribution_results
  has_many :addresses
  has_many :meters
  has_many :device_capabilities, :through => :meters
  has_many :email_addresses

除了用户之外,所有关联和关联函数似乎都按预期工作 -> distribution_results has_many / belongs_to

在尝试创建 user.distribution_result 时出现错误:

名称错误: 未初始化的常量 User::DistributionResult

distribution_results 表中有一个 user_id 字段。

完整的错误跟踪是:

NameError: uninitialized constant User::DistributionResult
from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/inheritance.rb:158:in `compute_type'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/reflection.rb:271:in `compute_class'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/reflection.rb:267:in `klass'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/associations/association.rb:118:in `klass'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/associations/collection_association.rb:39:in `reader'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/associations/builder/association.rb:115:in `distribution_results'
    from (irb):7
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/railties/lib/rails/commands/console.rb:110:in `start'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/railties/lib/rails/commands/console.rb:9:in `start'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/railties/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/railties/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/railties/lib/rails/commands.rb:17:in `<top (required)>'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:274:in `require'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:274:in `block in require'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:274:in `require'
    from /Users/craigwebster/bolton-eqa-website/bin/rails:8:in `<top (required)>'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:268:in `load'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:268:in `block in load'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activesupport/lib/active_support/dependencies.rb:268:in `load'
    from /Users/craigwebster/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /Users/craigwebster/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'

我正在尝试在用户模型中实现一个 before destroy 回调方法

before_destroy :check_any_email_addresses, :check_any_meters, :check_any_distribution_results, :check_any_addresses

def check_any_email_addresses   
if email_addresses.any?     
  self.errors[:base] << "Cannot delete Prime Contractor while an associated email exists."
  return false   
end 
end 

def check_any_meters   
  if meters.any?     
    self.errors[:base] << "Cannot delete Prime Contractor while an associated meter exists."
    return false   
  end 
end 

def check_any_distribution_results   
  if distribution_results.any?     
    self.errors[:base] << "Cannot delete Prime Contractor while an associated distribution result exists."
    return false   
  end 
end 

def check_any_addresses   
  if addresses.any?     
    self.errors[:base] << "Cannot delete Prime Contractor while an associated address exists."
    return false   
  end 
end 

所有其他回调方法都可以正常工作

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    更新:

    我突然想到你的模型是复数的。应该是DistributionResult,其中有表distribution_results

    将您的呼叫更改为:

    user.distribution_results
    

    注意结果的复数形式。这是因为userhas_manydistribution_results

    【讨论】:

    • 如果我尝试这个测试 @user=User.new => #
    • 该错误将引用特定文件中的特定行。您能否将其附加到您的问题中?
    • 此时的堆栈跟踪是:来自 /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/inheritance.rb :158:in compute_type' from /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/reflection.rb:271:in compute_class' 来自 /Users/craigwebster/.rvm/gems/ruby-2.2.0/bundler/gems/rails-e43545794963/activerecord/lib/active_record/reflection.rb:267:in `klass'还有更多
    • 我想使用以下的 before_delete 回调:def check_any_distribution_results if distribution_results.any? self.errors[:base]
    • 我很确定该关联没有问题。还有什么不对劲的。如果你想修改问题我可以看看。
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多