在'rails generate scaffold scaffoldname name:string id:integer'之后将id更改回rowid

时间:2013-01-17 13:34:46

标签: ruby-on-rails scaffolding rowid

我遇到了使用脚手架创建的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列?

2 个答案:

答案 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

撤消脚手架生成。