我正在创建一个名为Index
的表。这是迁移:
class CreateIndices < ActiveRecord::Migration
def change
create_table :indices, {:id => false} do |t|
t.string :name
t.float :returns, array: true, default: []
t.float :navs, array: true, default: []
t.float :sharpe
t.timestamps
end
execute "ALTER TABLE indices ADD PRIMARY KEY (name);"
end
end
一切正常。我在另一个Stack Overflow问题中看到,我必须在我的模型中包含set_primary_key
命令才能使它工作,所以我在index.rb中有以下内容
class Index < ActiveRecord::Base
set_primary_key :name
end
除了这两个文件之外,我没有更改默认的Rails脚手架(该应用程序是使用Postgres创建的默认数据库)。当我转到localhost:3000/indices
时,我收到以下错误
undefined method `set_primary_key' for #<Class:0x37132e0>
如果我注释掉set_primary_key
行,它会加载常规的空脚手架,但我认为这并不能提供我想要的主键功能。我做错了什么?
答案 0 :(得分:18)
如果您使用的是rails 3.2或更高版本,set_primary_key
方法已弃用,请查看Rails 3.2 release notes - 第8.1节,并建议使用分配方法,例如self.primary_key=
,就像你说你在评论中所做的那样
答案 1 :(得分:0)
它当前是一种类方法:
不要忘记适当的迁移:
def up
create_table :books, {id: false, primary_key: :key_id} do |t|
t.timestamps
etc.
end
execute <<-SQL
ALTER TABLE books
ADD PRIMARY KEY (key_id)
SQL
end
def down
drop_table :books
end
如果要在生成的路由(routes.rb)中使用此新主键:
resources :books, only: [:show, :edit, :update], param: :key_id
希望它有所帮助!
小心
答案 2 :(得分:-2)
怪异。根据{{3}}我的预期
class Index < ActiveRecord::Base
set_primary_key "name"
end
上班。我能看到的唯一区别是"name"
字符串与您的:name
符号不应有任何区别。
<强>更新强>
实际上,该链接的顶部是一条已弃用的消息(抱歉)。显然它现在是一种类方法,因此解释了对self.set_primary_key
的需求。卫生署!