gpt4 book ai didi

ruby-on-rails - ActiveRecord 错误的表名

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:12 25 4
gpt4 key购买 nike

我正在尝试添加一个名为 Media 的 ActiveRecord 模型。迁移脚本如下所示

class CreateMedias < ActiveRecord::Migration
def up
create_table :medias do |t|
t.string :filename
t.timestamps null: false
end
end
def down
drop_table :medias
end
end

如我所料,这将在我的 PostgreSQL 数据库中创建一个名为 medias 的表。我的 ActiveRecord 类看起来像这样

class Media < ActiveRecord::Base

end

据我了解,这应该是这样的。 ActiveRecord 类的名称应该是单数,表名应该是复数。但是,当我尝试创建一个新的媒体对象时

Media.create filename: "abc.png"

出现以下错误

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation    "media" does not exist
LINE 5: WHERE a.attrelid = '"media"'::regclass
^
: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"media"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum

出于某种原因,ActiveRecord 认为 table_name 应该是 media 而不是 medias。如果我直接在数据库中使用“medias”而不是“media”运行相同的查询,我会得到预期的结果。对于我的所有其他模型,table_name 是复数形式,但出于某种原因,我的 Media 模型是一个异常(exception)。有谁知道这可能是什么原因造成的?

最佳答案

Media 已经是复数形式(它是 medium 的复数形式),因此 active record 不再复数,即使人们经常说“medias”也是如此。

您可以从 Rails 控制台检查 Rails 如何复数化

"medium".pluralize #=> "media"
"media".pluralize #=> "media"

如果您强烈反对并且不想重命名您的表/模型,您可以强制事件记录使用您的表名

class Media < ActiveRecord::Base
self.table_name = "medias"
end

或自定义变形。您的应用程序应该有一个 config/initializers/inflections.rb,其中规定了如何执行此操作。

关于ruby-on-rails - ActiveRecord 错误的表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com