Abr*_*ris 3 ruby postgresql activerecord ruby-on-rails
我正在尝试添加名为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
Run Code Online (Sandbox Code Playgroud)
这将在我的PostgreSQL数据库中创建一个名为medias的表,就像我预期的那样.我的ActiveRecord类看起来像这样
class Media < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它应该是这样的.ActiveRecord类的名称应为单数,表名称应为复数.但是,当我尝试创建一个新的Media对象时
Media.create filename: "abc.png"
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
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
Run Code Online (Sandbox Code Playgroud)
出于某种原因,ActiveRecord认为table_name应该是media而不是medias.如果我使用'medias'而不是'media'直接在数据库中运行相同的查询,我会得到预期的结果.对于我的所有其他模型,table_name是复数形式但由于某种原因我的Media模型是一个例外.有谁知道这会导致什么?
媒体已经是复数(它是复数的媒介),所以即使人们经常说"媒体",积极的记录也不会进一步复杂化.
您可以从rails控制台检查rails如何将内容复杂化
"medium".pluralize #=> "media"
"media".pluralize #=> "media"
Run Code Online (Sandbox Code Playgroud)
如果您强烈反对并且不想重命名表/模型,则可以强制使用活动记录来使用表名
class Media < ActiveRecord::Base
self.table_name = "medias"
end
Run Code Online (Sandbox Code Playgroud)
或自定义变形.您的应用应该有一个config/initializers/inflections.rb,其中列出了如何执行此操作.