Ruby on rails 创建外键时列名的复数形式不正确
我对Rails 4.2.4有一个奇怪的问题。我正在创建一个新表,该表引用了其他一些表,如下所示:Ruby on rails 创建外键时列名的复数形式不正确,ruby-on-rails,activerecord,foreign-keys,inflection,Ruby On Rails,Activerecord,Foreign Keys,Inflection,我对Rails 4.2.4有一个奇怪的问题。我正在创建一个新表,该表引用了其他一些表,如下所示: t.references :local, index: true, foreign_key: true, null: false t.references :serie, index: true, foreign_key: true, null: false 执行迁移时,创建外键约束时出错: PG::UndefinedColumn:错误:不存在列«系列id»参考 哪个是西班牙语 PG::Undef
t.references :local, index: true, foreign_key: true, null: false
t.references :serie, index: true, foreign_key: true, null: false
执行迁移时,创建外键约束时出错:
PG::UndefinedColumn:错误:不存在列«系列id»参考
哪个是西班牙语
PG::UndefinedColumn:错误:外键约束中引用的«series_id»列不存在
这意味着在创建的表中没有“series_id”列。当然,它不应该是任何具有该名称的列
生成FK时应该查找的正确列名是“serie_id”,并且它确实存在
现在最奇怪的是,它并没有失败:例如,本地。它不查找“locales\u id”,而是查找正确的“local\u id”,并创建相应的FK
我有自定义的西班牙语屈折变化,正确的复数形式是:
本地->地区
系列->系列
然而,我不明白为什么FK一代似乎在一种情况下而不是在另一种情况下多元化
我在中找到了一个有效的解决方案,即专门声明外键,如:
add_foreign_key :turnos_registrados, :series, column: :serie_id
但我想知道的是为什么会这样
提前感谢。Rails似乎执行以下步骤来获取外键列名: 迁移中的引用模型→ (将符号转换为字符串)→ 多元化→ 奇点化 在为给定的引用模型查找表名时,将完成复数化,请参阅。然后,从以前的复数表名导出实际外键列(请参阅) 然而,在英语中,“series”是a,所以单数形式和复数形式是相同的。默认情况下,Rails会正确处理此问题:
"series".pluralize
# => "series"
"series".singularize
# => "series"
但也要注意这一点:
"serie".pluralize
# => "series"
因此,首先将“s”附录添加到系列
参考模型名称中,然后奇点化产生相同的单词-“series”。也就是说,Rails从您的迁移中为:serie
参考模型生成以下内容:
:serie → "serie" (conversion to string) → "series" (pluralize) → "series" (singularize)
这就是为什么Rails试图查找series\u id
外键列,而不是locales\u id
您写道,您使用add\u foreign\u key
手动添加了正确的密钥。我怀疑稍后您的设置会遇到更多问题,因为Rails仍将尝试将外键导出为series\u id
您必须在关联中的所有位置指定正确的(serie\u id
)外键,或者您应该为您的案例定义一个自定义多重化规则。应将规则添加为初始值设定项,该初始值设定项包含:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'serie', 'series'
end
一旦您具备了这一点,多元化将在您的特定案例中发挥预期的作用:
"series".singularize
# => "serie"
有了这个自定义规则,我认为即使是您最初的迁移也应该可以正常工作。Rails似乎执行以下步骤来获取外键列名: 迁移中的引用模型→ (将符号转换为字符串)→ 多元化→ 奇点化 在为给定的引用模型查找表名时,将完成复数化,请参阅。然后,从以前的复数表名导出实际外键列(请参阅) 然而,在英语中,“series”是a,所以单数形式和复数形式是相同的。默认情况下,Rails会正确处理此问题:
"series".pluralize
# => "series"
"series".singularize
# => "series"
但也要注意这一点:
"serie".pluralize
# => "series"
因此,首先将“s”附录添加到系列
参考模型名称中,然后奇点化产生相同的单词-“series”。也就是说,Rails从您的迁移中为:serie
参考模型生成以下内容:
:serie → "serie" (conversion to string) → "series" (pluralize) → "series" (singularize)
这就是为什么Rails试图查找series\u id
外键列,而不是locales\u id
您写道,您使用add\u foreign\u key
手动添加了正确的密钥。我怀疑稍后您的设置会遇到更多问题,因为Rails仍将尝试将外键导出为series\u id
您必须在关联中的所有位置指定正确的(serie\u id
)外键,或者您应该为您的案例定义一个自定义多重化规则。应将规则添加为初始值设定项,该初始值设定项包含:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'serie', 'series'
end
一旦您具备了这一点,多元化将在您的特定案例中发挥预期的作用:
"series".singularize
# => "serie"
有了这个自定义规则,我认为即使是您最初的迁移也应该可以顺利进行。多亏了,我进一步找到了“原因”:
似乎一些高优先级的Rails默认英语词形变化正在妨碍我们
我有一个拐点规则
inflect.singular(/((?<![aeiou][rndlj])e|a|i|o|u)s([A-Z]|_|$)/, '\1\2')
自
使它工作,但它应该工作没有太多。因此,我怀疑一些预定义的规则,可以在控制台中确认(另一个BoraMa的贡献),因为对句子的响应
ActiveSupport::Inflector.inflections.singulars
将打印以下内容:[/(s)系列$/i,“\1系列”]
为了消除这些默认设置,添加
inflect.clear
到拐点。rb成功了。现在,它与我最初拥有的更一般的规则一起工作。多亏了,我进一步找到了“为什么”:
似乎一些高优先级的Rails默认英语词形变化正在妨碍我们
我有一个拐点规则
inflect.singular(/((?<![aeiou][rndlj])e|a|i|o|u)s([A-Z]|_|$)/, '\1\2')
自
使它工作,但它应该工作没有太多。因此,我怀疑一些预定义的规则,可以在控制台中确认(另一个BoraMa的贡献),因为对句子的响应
ActiveSupport::Inflector.inflections.singulars
将打印以下内容:[/(s)系列$/i,“\1系列”]
为了消除这些默认设置,添加
inflect.clear
到拐点。rb成功了。现在它与我最初使用的更一般的规则一起工作