Ruby on rails 在';之后将id更改回rowid;rails生成脚手架scaffoldname:string id:integer';
使用脚手架创建的id列有问题。我使用以下命令生成了一个scaffold: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的表中也
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