Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 创建外键时列名的复数形式不正确_Ruby On Rails_Activerecord_Foreign Keys_Inflection - Fatal编程技术网

Ruby on rails 创建外键时列名的复数形式不正确

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

我对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::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成功了。现在它与我最初使用的更一般的规则一起工作