访问活动记录关系时出现奇怪的错误 [英] Strange error while accessing active record relation

查看:93
本文介绍了访问活动记录关系时出现奇怪的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下模型:

class Segment < ActiveRecord::Base
  has_many :families, :foreign_key => :segment_code, :primary_key => :code
end

class Family < ActiveRecord::Base
  belongs_to :segment, :foreign_key => :segment_code, :primary_key => :code
  has_many :genus, :foreign_key => :family_code, :primary_key => :code
end

class Genus < ActiveRecord::Base
  belongs_to :family, :foreign_key => :family_code, :primary_key => :code
  has_many :commodities, :foreign_key => :genus_code, :primary_key => :code
end

class Commodity < ActiveRecord::Base
  belongs_to :genus, :foreign_key => :genus_code, :primary_key => :code
end

在调用以下Rails Console irb命令序列时出现此错误,我迷路了,请帮助。我还认为我可能需要使用许多:through。

And I get this error when calling this sequence of rails console irb commands, i'm lost please help. I'm also thinking I might need to use has many :through. critiques on my data model are welcome also.

这是错误: NameError:未初始化的常量Family :: Genu

irb(main):003:0> @genus = Genus.first
  ←[1m←[35mGenus Load (15.6ms)←[0m  SELECT `genus`.* FROM `genus` LIMIT 1
=> #<Genus key: 100003, family_code: 10100000, code: 10101500, title: "Livestock", defintion: nil>
irb(main):004:0> @genus.family
  ←[1m←[36mFamily Load (0.0ms)←[0m  ←[1mSELECT `families`.* FROM `families` WHERE `families`.`code` = 10100000 LIMIT 1←[0m
=> #<Family key: 100002, segment_code: 10000000, code: 10100000, title: "Live animals", definition: nil>
irb(main):005:0> @family = @genus.family.first
NoMethodError: undefined method `first' for #<Family:0x2621a60>
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activemodel-3.1.0/lib/active_model/attribute_methods.rb:385:in `method_missing'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/attribute_methods.rb:60:in `method_missing'
        from (irb):5
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
irb(main):006:0> @family = @genus.family
=> #<Family key: 100002, segment_code: 10000000, code: 10100000, title: "Live animals", definition: nil>
irb(main):007:0> @family.genus
NameError: uninitialized constant Family::Genu
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/base.rb:1335:in `compute_type'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/reflection.rb:173:in `klass'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/associations/association.rb:118:in `klass'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/associations/association.rb:166:in `find_target?'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/associations/collection_association.rb:323:in `load_target'
        from C:in `load_target'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/associations/collection_proxy.rb:89:in `method_missing'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
irb(main):008:0>


推荐答案

它与属/属的复数形式混淆(不是Genu / Genus),并且正在删除 s以使其单数化。在config / initializers / inflections.rb

It is confused by the plural form of Genus/Genera (not Genu/Genus), and is removing the 's' to singularize. Fix this in the config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'genus', 'genera'
end

其中如果您需要更改has_many:

In which case you need to change your has_many:

class Family < ActiveRecord::Base
  belongs_to :segment, :foreign_key => :segment_code, :primary_key => :code
  has_many :genera, :foreign_key => :family_code, :primary_key => :code
end

或者您可以这样做,这不是正确的英语,但是使现有代码正常工作:

Or you can do this, which is not correct English, but would make your existing code work:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( genus )
end

这篇关于访问活动记录关系时出现奇怪的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆