2017-04-14 1 views
1

J'essaie de faire une chose de type site e-commerce en utilisant Rails. J'ai donc fait mes modèles pour ça. Mon problème est comment faire d'un élément particulier une clé primaire?Comment ajouter une clé primaire à 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 

Ceci est une partie du fichier schema.rb. Est-ce que la façon dont j'ai marqué l'identifiant du signet comme clé primaire est correcte? En outre, après avoir fait ces changements, je courais rails db: migrate commande et la partie clé primaire disparait et devient comme 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 

Je ne comprends pas pourquoi cela est arrivé et pourquoi ces changements que j'ai fait (je l'ai fait enregistrer le fichier après l'édition) a juste disparu. Quelqu'un peut m'expliquer cela? Aussi, je voudrais mentionner que j'apprends Ruby on Rails alors ... s'il vous plaît soyez gentil avec moi. : P

+2

S'il vous plaît ne pas poster des images, le code postal sous forme de texte. – mudasobwa

+0

@mudasobwa fait. – sindhugauri

+0

_Sidenote: _ il y a un deux-points et ensuite une virgule manquante dans la ligne supérieure de votre migration: ': primary_key =>: bk_id, force:: cascade'. – mudasobwa

Répondre

4

Dans votre fichier de migration:

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

Ne pas oublier d'indiquer dans votre modèle aussi:

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

En supposant qu'il est Rails4 +, vous pourriez faire:

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

En Rails3 vous mettez juste une déclaration supplémentaire après:

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

J'ai Rails 5.0.1. La même chose s'est produite comme indiqué dans la question. J'ai fait les changements, et en exécutant la commande 'rails db: migrate', cette partie a juste disparu. Est-ce censé se produire? – sindhugauri

+0

Ah, jeez, vous changez le fichier 'db/schema.rb'_ ?! Ne fais pas ça, change une migration. – mudasobwa

+0

Ok, c'est cool. Pouvez-vous expliquer la différence entre les deux? – sindhugauri

0

Ne pas modifier le contenu du fichier schema.rb. Ce contenu sera généré automatiquement à partir de vos fichiers de migration. Essayez de trouver votre fichier de migration de créer des signets et ajoutez-y :primary_key => bk_id.

fichier: db/migrate/xxxxxxxxxx_create_bookmarks.rb (xxxxxxxxx est un horodatage)

Aide ça aide.