【问题标题】:rails: create a single table without idrails: 创建一个没有 id 的表
【发布时间】:2010-07-28 13:59:44
【问题描述】:
我刚刚在 rails 中生成了我的第一个脚手架。现在,我不希望我的表有一个名为“id”的字段。相反,我希望它被命名为“uid”,这将是一个任意字符串。但我似乎无法理解如何做到这一点。尤其是管理路线。我已经设法设置 :id=>false 并将“uid”定义为主键,但控制器失败了,因为它仍然试图通过 id 查找。我该如何处理?
另外,还有什么我不知道的可能会爆炸吗?
而且,我知道 Rails 完全是关于惯例的,我不能试图违背“rails 方式”,但我真的希望这件事能以这种方式工作。
【问题讨论】:
标签:
ruby-on-rails
routing
【解决方案1】:
在您的迁移中更新您的代码,如下所示:
create_table :table_name, :primary_key => :uid do |t|
...
end
而且你的模型应该包含这一行:
class ModelName < ActiveRecord::Base
set_primary_key :uid
end
所有操作都与普通 id 列相同。
Model.find 将通过 uid,而不是 id 等查找...
【解决方案2】:
您应该可以通过以下方式找到记录:
@record = Model.find('foo')
或
@record = Model.find_by_uid('foo')
【解决方案3】:
确保在您的迁移文件中有:
create_table :table_name, :primary_key => :uid do |t|
...
然后插入你的模型:
self.primary_key = "uid"
按照 John Topley 的说法找到您的记录:
@record = Model.find('foo')
这应该可行
【解决方案4】:
现有的答案虽然对旧版本很好,但已经过时,所以这里是更新:
(建立在复古的 +1 答案之上:)
迁移:
create_table :table_name, id: false, :primary_key => :uid do |t|
...
end
型号:
class ModelName < ActiveRecord::Base
self.primary_key= :uid
end
注意:我相信这个变化可以追溯到~rails 3,但是我对此不是100%确定的。
快乐的编码。