如何将主键添加到Rails?

时间:2017-04-14 07:20:26

标签: ruby-on-rails ruby database sqlite schema

我试图使用Rails创建一个电子商务网站。所以我为它制作了我的模型。我的问题是如何将特定元素作为主键?

create_table "bookmarks", :primary_key => bk_id force: :cascade do |t|
  t.string   "bk_name"
  t.string   "size"
  t.string   "brand"
  t.string   "product_id"
  t.integer  "mrp"
  t.text     "colour"
  t.integer  "stock"
  t.integer  "discount"
  t.text     "bk_description"
  t.integer  "bk_id",          primary:true
  t.integer  "cart_unit"
  t.datetime "created_at",     null: false
  t.datetime "updated_at",     null: false
end

这是schema.rb文件的一部分。我将标记的书签ID标记为主键是否正确?此外,在进行这些更改后,我运行了rails db:migrate命令,主键部分消失了,它变成了这样 -

create_table "bookmarks",force: :cascade do |t|
  t.string   "bk_name"
  t.string   "size"
  t.string   "brand"
  t.string   "product_id"
  t.integer  "mrp"
  t.text     "colour"
  t.integer  "stock"
  t.integer  "discount"
  t.text     "bk_description"
  t.integer  "bk_id"
  t.integer  "cart_unit"
  t.datetime "created_at",     null: false
  t.datetime "updated_at",     null: false
end

我不明白为什么会发生这种情况以及为什么我做的这些更改(我在编辑后保存了文件)就消失了。谁可以给我解释一下这个?另外,我想提一下我学习Ruby on Rails所以...请对我温柔。 :P

3 个答案:

答案 0 :(得分:5)

在您的迁移文件中:

create_table :bookmarks, :primary_key => :bk_id do |t|
    ...
    t.integer :bk_id
    ...
end

不要忘记在你的模型中注明它:

class Bookmarks < ActiveRecord::Base
    self.primary_key = 'bk_id'
end

答案 1 :(得分:2)

假设它是Rails4 +,你可以这样做:

create_table :bookmarks, force: :cascade do |t|
  ...
  t.integer  :bk_id, primary_key: true
  ...
end

在Rails3中,您只需在以下内容后添加一条声明:

create_table "bookmarks", force: :cascade do |t|
  ...
  t.integer  "bk_id"
  ...
end
execute "ALTER TABLE bookmarks ADD PRIMARY KEY (bk_id);"

答案 2 :(得分:0)

请勿更改schema.rb文件的内容。此内容将从您的迁移文件中自动生成。尝试找到您的创建书签迁移文件并向其添加:primary_key => bk_id

档案:db/migrate/xxxxxxxxxx_create_bookmarks.rb xxxxxxxxx是时间戳

帮助它。