我遇到了使用脚手架创建的id列的问题。我使用以下命令生成了一个脚手架:
rails generate scaffold scaffoldname name:string id:integer
我将id列用于我想用于collection_select
的下拉菜单的关系。之后我意识到生成一个id是不必要的,因为rails会自动为每个表创建一个id。
当我想用自创的id调用相关表时,这当然可以用
class.relatedClass.id
之后我意识到这个命令也可以在rails创建id的表中完成,尽管该列在表中被命名为“rowid”。
所以我认为应该可以通过迁移删除自己创建的id列。我想到的方式是,rails应该自动使用rowid作为关系。但删除自己创建的ID后,周围都会出现错误。 Rails拒绝自动使用'rowid'列,尽管如果没有在scaffold命令中指定id列,它会这样做。
如何在调用class.relatedClass.id
之后以rails使用自己创建的rowid的方式删除该自创建的id列?
答案 0 :(得分:2)
在rails terminal中运行 -
rails g migration remove_id_from_scaffoldname id:integer
rails g migration add_rowid_to_scaffoldname rowid:integer
这将创建两个迁移文件 - 一个用于删除id
字段,另一个用于添加rowid
字段。
然后在rails terminal中运行 -
rake db:migrate
另请注意,rails会自动创建id
字段,但不会rowid
作为主键。要限制rails使用您定义的主键,您必须在此明确定义 -
您的迁移文件 -
create_table :tablename, :primary_key => :rowid do |t|
# ...
end
您的模型 -
class ModelName< ActiveRecord::Base
self.primary_key = "rowid"
...
end
注意:最好使用自动生成的导轨id
作为主键,除非您有正当理由这样做。
答案 1 :(得分:1)
您可以做的一件事是运行向下迁移,从迁移中删除id字段并再次运行向上迁移。
运行生成时,它会创建一个类似于以下内容的迁移文件:
db/migrate/20130117134712_create_scaffoldnames.rb
如果您执行db / migrate的ls,您将看到其他迁移
> ls db/migrate
20130114170853_create_server_requests.rb
20130117134712_create_scaffoldnames.rb
您可以通过运行db:migrate到先前版本来运行向下迁移到20130117134712_create_scaffoldnames
> rake db:migrate VERSION=20130114170853
然后按照您希望的方式编辑您的脚手架名称迁移,然后再次运行db:migrate。
我一直这样做。诀窍是在我们的开发环境本地化时捕获这些修改,所以我可以做这些事情。
另外,如果你及早发现它,你可以运行
rails destroy scaffold scaffoldname
撤消脚手架生成。