Ruby on rails 在';之后将id更改回rowid;rails生成脚手架scaffoldname:string id:integer';

Ruby on rails 在';之后将id更改回rowid;rails生成脚手架scaffoldname:string id:integer';,ruby-on-rails,scaffolding,rowid,Ruby On Rails,Scaffolding,Rowid,使用脚手架创建的id列有问题。我使用以下命令生成了一个scaffold: rails generate scaffold scaffoldname name:string id:integer 我将该id列用于一个关系,我想将其用于带有collection\u select的下拉菜单。后来我意识到生成一个id是不必要的,因为rails会为每个表自动创建id 当我想用自己创建的id调用相关表时,这当然是可能的 class.relatedClass.id 后来我意识到,在rails创建id的表中也

使用脚手架创建的id列有问题。我使用以下命令生成了一个scaffold:

rails generate scaffold scaffoldname name:string id:integer
我将该id列用于一个关系,我想将其用于带有
collection\u select
的下拉菜单。后来我意识到生成一个id是不必要的,因为rails会为每个表自动创建id

当我想用自己创建的id调用相关表时,这当然是可能的

class.relatedClass.id

后来我意识到,在rails创建id的表中也可以使用此命令,尽管表中的列名为“rowid”

因此,我认为应该可以通过迁移删除自行创建的id列。我的想法是,rails应该自动为关系使用rowid。但是在删除自己创建的id之后,到处都是错误。Rails拒绝自动使用“rowid”列,尽管它在scaffold命令中没有指定id列的情况下会这样做


在调用
class.relatedClass.id
时,如何删除自创建的id列,使rails在调用
class.relatedClass.id时使用自己创建的rowid?

在rails终端中运行此命令-

rails g migration remove_id_from_scaffoldname id:integer

 rails g migration add_rowid_to_scaffoldname rowid:integer
   rake db:migrate
这将创建两个迁移文件—一个用于删除
id
字段,另一个用于添加
rowid
字段

然后在rails终端运行此命令-

rails g migration remove_id_from_scaffoldname id:integer

 rails g migration add_rowid_to_scaffoldname rowid:integer
   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
您的型号-

create_table :tablename, :primary_key => :rowid do |t|
 # ...
end
class ModelName< ActiveRecord::Base
  self.primary_key = "rowid"
  ...
end
classmodelname

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

在rails终端中运行此操作-

rails g migration remove_id_from_scaffoldname id:integer

 rails g migration add_rowid_to_scaffoldname rowid:integer
   rake db:migrate
这将创建两个迁移文件—一个用于删除
id
字段,另一个用于添加
rowid
字段

然后在rails终端运行此命令-

rails g migration remove_id_from_scaffoldname id:integer

 rails g migration add_rowid_to_scaffoldname rowid:integer
   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
您的型号-

create_table :tablename, :primary_key => :rowid do |t|
 # ...
end
class ModelName< ActiveRecord::Base
  self.primary_key = "rowid"
  ...
end
classmodelname

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

您可以做的一件事是运行向下迁移,从迁移中删除id字段,然后再次运行向上迁移

运行generate时,它创建了一个迁移文件,如下所示:

db/migrate/20130117134712_create_scaffoldnames.rb
如果执行ls的db/migrate,您将看到其他迁移

> ls db/migrate
20130114170853_create_server_requests.rb
20130117134712_create_scaffoldnames.rb
通过运行db:migrate to the previous version,可以向下迁移到20130171134712_create_scaffoldnames

> rake db:migrate VERSION=20130114170853
然后按您希望的方式编辑您的scaffoldnames迁移,然后再次运行db:migrate

我总是这样做。诀窍是在我的开发环境中本地捕获这些修改,这样我就可以做这些事情

而且,如果你足够早地抓住它,你可以跑

rails destroy scaffold scaffoldname

要撤消脚手架生成,可以执行向下迁移,从迁移中删除id字段,然后再次运行向上迁移

运行generate时,它创建了一个迁移文件,如下所示:

db/migrate/20130117134712_create_scaffoldnames.rb
如果执行ls的db/migrate,您将看到其他迁移

> ls db/migrate
20130114170853_create_server_requests.rb
20130117134712_create_scaffoldnames.rb
通过运行db:migrate to the previous version,可以向下迁移到20130171134712_create_scaffoldnames

> rake db:migrate VERSION=20130114170853
然后按您希望的方式编辑您的scaffoldnames迁移,然后再次运行db:migrate

我总是这样做。诀窍是在我的开发环境中本地捕获这些修改,这样我就可以做这些事情

而且,如果你足够早地抓住它,你可以跑

rails destroy scaffold scaffoldname

撤消脚手架生成。

为什么在
rails generate
命令中包含
id:integer
?这难道不能导致某种不必要的重复吗?也许这是误导,因为这不是我答案的一部分。我的意思是,问题中的“创建”是一个印刷错误。我会把我的帖子编辑得更清楚。事实上,“创建”是一个印刷错误。对不起!我会改正的!为什么要在
rails generate
命令中包含
id:integer
?这难道不能导致某种不必要的重复吗?也许这是误导,因为这不是我答案的一部分。我的意思是,问题中的“创建”是一个印刷错误。我会把我的帖子编辑得更清楚。事实上,“创建”是一个印刷错误。对不起!我会改正的!generate命令中的“create”是错误的吗?generate命令中的“create”是错误的吗?好的,我想我明白了。我的失败在于,我认为rails生成的id列是“rowid”,当我使用SQLItemManager查看它时,我可以在所有表中看到它。但是这个列似乎只是excel(1..n)中的行标签,而不是从rails本身创建的。我现在在SQLItemManager中看到了sql查询,它创建了输出:`SELECT rowid,*FROM“testmodels”;´. 感谢您提示rowid不是rails生成的id!好的,我想我明白了。我的失败在于,我认为rails生成的id列是“rowid”,当我使用SQLItemManager查看它时,我可以在所有表中看到它。但这列似乎只是excel(1..n)中的行标签,而不是c