class CreateStores < ActiveRecord::Migration[5.1]
def change
create_table :stores do |t|
t.string :title
t.string :address
# 純用 integer
t.integer :user_int_id
# 用 integer 並且加上 index
t.integer :user_int_index_id, index: true
# 用 integer 並且加上 foreign_key
t.integer :user_int_key_id, foreign_key: true
# 純用 references
t.references :user_ref
# 用 references 並且加上 index
t.references :user_ref_index, index: true
# 用 references 並且加上 foreign_key
t.references :user_ref_key, foreign_key: true
t.timestamps
end
end
end
db/schema.rb 的結果如下:
create_table "stores", force: :cascade do |t|
t.string "title"
t.string "address"
t.integer "user_int_id"
t.integer "user_int_index_id"
t.integer "user_int_key_id"
t.integer "user_ref_id"
t.integer "user_ref_index_id"
t.integer "user_ref_key_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_int_index_id"], name: "index_stores_on_user_int_index_id"
t.index ["user_ref_id"], name: "index_stores_on_user_ref_id"
t.index ["user_ref_index_id"], name: "index_stores_on_user_ref_index_id"
t.index ["user_ref_key_id"], name: "index_stores_on_user_ref_key_id"
end
可以看得出來:
references 的寫法最後也是產生 integer 欄位,但會自動補上 _id 名稱
(看t.integer的部分)
在純用 integer 的寫法中,需要主動告知 index: true 才會幫忙加索引,用 forign_key 的方式不會。
(看t.index的部分,只有user_int_index_id有,另外兩個都沒有)
用 references 的寫法,不管有沒有 index: true,都會自動幫你加上索引。
(看t.index的部分 user_ref /user_ref_index /user_ref_key)
資料來源:
龍哥解答