Rails中的set_primary_key错误

时间:2013-12-04 21:42:18

标签: ruby-on-rails primary-key

我正在创建一个名为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行,它会加载常规的空脚手架,但我认为这并不能提供我想要的主键功能。我做错了什么?

3 个答案:

答案 0 :(得分:18)

如果您使用的是rails 3.2或更高版本,set_primary_key方法已弃用,请查看Rails 3.2 release notes - 第8.1节,并建议使用分配方法,例如self.primary_key=,就像你说你在评论中所做的那样

答案 1 :(得分:0)

它当前是一种类方法:

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/PrimaryKey/ClassMethods.html#method-i-primary_key-3D

不要忘记适当的迁移:

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的需求。卫生署!