2012-05-31 37 views
0

我有這些模型:奇怪的錯誤,同時訪問活動記錄關係

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 

,並呼籲軌控制檯IRB命令序列,當我得到這個錯誤,我迷路了,請幫助。我也想我可能需要使用有很多:through。對我的數據模型的批評也是受歡迎的。

這是錯誤:NameError: uninitialized constant 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> 

回答

2

它是由屬/屬(未膝/屬)的複數形式相混淆,並且去除的「s」到singularize。在config /初始化/是inflections.rb

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

在這種情況下,你需要改變你的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 

或者你也可以做到這一點,這是不正確的英語,而且也使得您現有的代碼工作:

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

與其積累技術債務,並遵循最少驚喜的原則,我會重新命名錶格。 –

+0

這些關係看起來不錯,儘管外鍵列是非標準的。通常我會期望* _id而不是* _code。 –

+0

我們離最初的問題還差得很遠,也許你應該爲此另外添加一個SO問題? –