2012-07-20 44 views
0

这是建立在问题I asked before(没有任何运气)。在Rails/Postgres中使用字符串主键时,我应该删除默认的“id”字段吗?

我有哪里我使用一个字符串作为主键的模式:

class Employee < ActiveRecord::Base 
    self.primary_key = "employment_id" 
end 

此表还包含了Rails默认的“ID”字段,具有唯一性约束。

当我在本地添加一个新员工时,它一切正常,Rails自动生成一个新的唯一ID。

但是,当我在Heroku Postgres上运行它时,它将'id'和'employment_id'视为同一个字段。我试图通过手动设置一个唯一的ID来解决这个问题,但仍获得此行为:

Employee.new do |s| 

    max_id = Employee.maximum(:id) 
    puts max_id.to_s    # => 1803 

    s.employment_id = "fred_01"  
    s.id = max_id + 1 

    puts employment_id.to_s  # => 1804 

end 

我运行的Postgres 9.1.3本地(和Heroku的是9.1.4)。我在Rails 3.2.3上。

我的问题是:

  • 任何想法是怎么回事?
  • 您认为我正在使用employment_id作为主键吗?
  • 如果我删除'id'字段会有帮助吗?
  • 有什么其他的最佳做法,你会推荐?

感谢您的帮助!

德里克。

编辑:根据要求

添加迁移文件:

编辑

很亲切的人的指出这一点,但现在已经清楚,我认为真正的答案是“只因为你可以,并不意味着你应该!”

+0

难道你把':ID => FALSE'上迁移,创建表和模型时? – MurifoX 2012-07-20 13:54:01

+0

或者你可以看看这个问题:http://stackoverflow.com/questions/1200568/using-rails-how-can-i-set-my-primary-key-to-not-be-an-integer-typed -column – MurifoX 2012-07-20 13:55:13

+0

请注明您迁移文件在这里。 – gabrielhilal 2012-07-20 14:21:40

回答

1

this后,就应该解决的问题:

class CreateEmployees < ActiveRecord::Migration 
    def change 
    create_table :employees, {:id => false} do |t| 
     t.string :employment_id, :unique => true 
     etc... 
    end 
    end 
    execute "ALTER TABLE employees ADD PRIMARY KEY (employment_id);" 
end 

而且在你的模型:

class Employee < ActiveRecord::Base 
    set_primary_key :employment_id 
    ... 
end 
+0

伟大的东西。非常感激! – 2012-07-20 14:47:25

+0

如果您使用rails 3.2或更高版本,则不建议使用set_primary_key方法。 Rails 3.2发布说明 - 第8.1节,它建议使用赋值方法,而不是像“self.primary_key =:employment_id” – 2016-02-22 19:33:41

0

更新为Rails 4.2.0和Postgres的情况下,它可以帮助任何人.. 。

把一个id: :stringcreate_table选项:

class FooMigration < ActiveRecord::Migration 
    def change 
    create_table :foo, id: :string do |t| 
     t.string :name, null: false 
     t.timestamps null: false 
    end 
    end 
end 

耙分贝:迁移

== 20150225043441 FooMigration: migrating =========================== 
-- create_table(:foo, {:id=>:string}) -> 0.0031s 
== 20150225043441 FooMigration: migrated (0.0032s) ================== 

轨分贝(和\ d富)

psql (9.3.6) 
Type "help" for help. 

bar_development=# \d foo 
        Table "public.foo" 
    Column |   Type    | Modifiers 
------------+-----------------------------+----------- 
id   | character varying   | not null 
name  | character varying   | not null 
created_at | timestamp without time zone | not null 
updated_at | timestamp without time zone | not null 
Indexes: 
    "foo_pkey" PRIMARY KEY, btree (id) 

我结束了一个'not null'带有主键索引的字符串列。

使用比id其他列名的更复杂。

编辑(2015年2月26日):似乎有在轨道中的错误时,它产生的schema.rb文件。它不会记录自定义主键状态,您需要进入并编辑它以将id: :string选项添加到create_table呼叫。

即。

create_table "foo", id: :string, force: :cascade do |t| 
    t.string "name",  null: false 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

蹩脚的部分:每次进行迁移时,这种变化都将被撤消。你必须密切关注文件内容(或者写一个测试:))。

的BUG在PR 18228,合并轨道:主于1月3日,2015年

相关问题