【问题标题】:Rails migration create table w/ string based primary keyRails 迁移使用基于字符串的主键创建表
【发布时间】:2013-09-23 22:14:09
【问题描述】:

通过主键是字符串而不是 int 的迁移在 Rails 中创建表的正确方法是什么?

我尝试将primary_key 设置为@oldergod 在下面的答案中建议,但baz 似乎仍然设置为int

class CreateFoos < ActiveRecord::Migration
  def change
    create_table :foos, primary_key: 'baz' do |t|
    end
  end
end

更新

我已经试过了

class CreateFoos < ActiveRecord::Migration
  def change
    create_table :foos, primary_key: false do |t|
      t.string :baz
    end
  end
end

这让我更接近了一点,但仍然缺少列上的 PRIMARY 索引。我试过add_index :foos, :baz, type: :primary 但这会产生以下错误:

SQLite3::SQLException: near "primary": syntax error: CREATE primary INDEX "index_foos_on_baz" ON "foos" ("baz")/Users/kyledecot/.rvm/gems/ruby-1.9.3-p392/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in `initialize'

在查看http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_index_options 之后,这似乎应该可以工作

【问题讨论】:

  • 查看answer,它详细介绍了生成器的工作原理以及如何解决它。
  • 该答案的副作用是 rake db:schema:load 无法正常工作并创建 int 列。只有使用rake db:migrate 才能正常工作。
  • 您正在尝试更改 Rails 的预期行为,副作用是可以预料的。你为什么有兴趣这样做呢?使用整数主键有什么负面影响?

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

如果它是一个字符串有什么不同?请参阅create table 文档。

create_table :foos, primary_key: 'baz' do |t|
  t.column :baz, :string
end

另请注意,这只是设置表中的主键。你 另外需要通过配置模型中的主键 self.primary_key=。模型不会自动检测主键 他们的表定义。

【讨论】:

  • 我已经用我尝试过的方法更新了我的问题。 baz 仍被设置为整数。这是预期的行为,正如您在 create table 文档中看到的那样,您将我链接到“重命名主键列”附近。他们生成的输出是guid int(11)
  • @KyleDecot 更新了我的答案。你不是在 create_table 块中定义你的列吗?
  • 我尝试了给我消息 you can't redefine the primary key column 'baz'. To define a custom primary key, pass { id: false } to create_table. 然后将其设置为 false ,它创建了列但没有索引。我已经更新了当前失败的问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2017-10-28
  • 2018-10-28
  • 2014-05-30
相关资源
最近更新 更多