0

我有一个使用脚手架创建的 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' 列,尽管它会在脚手架命令中没有指定 id 列的情况下这样做。

如何在调用时以 Rails 使用自己创建的 rowid 的方式删除该自创建的 id 列class.relatedClass.id

4

2 回答 2

2

在 rails 终端运行它 -

rails g migration remove_id_from_scaffoldname id:integer

 rails g migration add_rowid_to_scaffoldname rowid:integer

这将创建两个迁移文件 - 一个用于删除id字段,另一个用于添加rowid字段。

然后在 rails 终端运行它 -

   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

注意:最好将自动生成的 railsid用作主键,除非您有正当理由这样做。

于 2013-01-17T13:45:55.417 回答
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 to previous version 来运行向下迁移到 20130117134712_create_scaffoldnames

> rake db:migrate VERSION=20130114170853

Then edit your scaffoldnames migration the way you want it, and run db:migrate again.

I do this all the time. The trick is to catch these modifications while they are local to my development environment, so I can do these thing.

Also, if you catch it early enough, you can run

rails destroy scaffold scaffoldname

to undo the scaffold generation.

于 2013-01-17T13:51:36.567 回答