sindhugauri
sindhugauri

Reputation: 189

How to add primary key to Rails?

I'm trying to make an e-commerce website type thing using Rails. So I've made my models for it. My problem is how to make a particular element a primary key?

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

This is a portion of the schema.rb file. Is the way I've marked bookmark id as the primary key correct? Also, after making these changes, I ran rails db:migrate command and the primary key portion disappears and it becomes like this-

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

I don't understand why this happened and why those changes I made (I did save the file after editing) just disappeared. Can someone explain this to me? Also, I'd like to mention that I'm learning Ruby on Rails so...please be gentle with me. :P

Upvotes: 2

Views: 3896

Answers (3)

user7866210
user7866210

Reputation: 81

In your migration file:

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

Do not forget to indicate it in your Model too:

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

Upvotes: 5

hoangdd
hoangdd

Reputation: 509

Don't change content of schema.rb file. This content will be auto generated from your migrate files. Try find your create bookmarks migrate file and add :primary_key => bk_id to it.

File: db/migrate/xxxxxxxxxx_create_bookmarks.rb (xxxxxxxxx is a timestamp)

Help it helps.

Upvotes: 0

Aleksei Matiushkin
Aleksei Matiushkin

Reputation: 121000

Assuming it’s Rails4+, you might do:

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

In Rails3 you just put an additional statement after:

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

Upvotes: 2

Related Questions