2

所以我看到这个奇怪的错误,当我尝试做一个相当简单的交互式测试我添加的关联。这里有两种型号:测试协会撬奇怪的错误

class Lot < ActiveRecord::Base 
    has_many :graves 
    belongs_to :block 
end 

class Grave < ActiveRecord::Base 
    belongs_to :lot 
end 

下面是创建表的迁移:

class CreateGraves < ActiveRecord::Migration 
    def change 
    create_table :graves do |t| 
     t.integer :grave_number 
     t.integer :lot_id 

     t.timestamps null: false 
    end 
    end 
end 

class CreateLots < ActiveRecord::Migration 
    def change 
    create_table :lots do |t| 
     t.integer :lot_number 
     t.integer :map_type 

     t.timestamps null: false 
    end 
    end 
end 

我调用撬带:

pry -r ./config/environment.rb 

然后在撬会议上,我简单地做:

lot = Lot.new 
l.graves 

我得到这个错误:

NameError: uninitialized constant Lot::Grafe 
from /.../activerecord-4.2.6/lib/active_record/inheritance.rb:158:in `compute_type' 

...有简单的路径,我的rbenv安装和红宝石2.3.0子目录链。我在那里替换它以保持输出可读。

我还有其他类定义了其他类似的关联,所有这些都按预期工作。

+1

改变从'类名后的默认行为坟墓'到'Gravesite'照顾这个。我不知道系统中的什么宝石会干扰Grave类的名称,但是无论它是哪一个,它都是一个巨大而嘈杂的WTF。 – jaydel

回答

2

这是Rails入侵者的问题。它发生在奇怪的时代,是一个奇怪的Rails怪癖。

2.3.1 :004 > a = "Grave" 
=> "Grave" 
2.3.1 :005 > a.pluralize 
=> "Graves" 
2.3.1 :006 > a = "graves" 
=> "graves" 
2.3.1 :007 > a.singularize 
=> "grafe" 

您可以覆盖在经常被忽略的./config/inflections.rb文件:

ActiveSupport::Inflector.inflections(:en) do |inflect| 
    inflect.irregular 'grave', 'graves' 
end 

变化

2.3.1 :001 > a = "grave" 
=> "grave" 
2.3.1 :002 > a.pluralize 
=> "graves" 
2.3.1 :003 > a = "graves" 
=> "graves" 
2.3.1 :004 > a.singularize 
=> "grave" 
+0

哇,我想我只需要在“我永远不会知道”下永久地提交这个文件。它不会让我奖励18个小时的奖金,但你会得到它。非常感谢。 – jaydel

+1

是的线索是在错误消息“NameError:未初始化的常量Lot :: Grafe”< - 注意常量Grafe而不是Grave。 :) – engineerDave

+0

所以我发现了一个随机的网站,显示了各种方式来结合古英语动词'格拉凡'这意味着'挖,挖起来; 坟墓;雕刻,凿子,刻'。其中一个变化确实是“grafe”。 – jaydel