我试图使用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
答案 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
是时间戳)
帮助它。