2015-08-25 26 views
6

Rails uygulamasında HABTM ilişkilerim için birleştirme tabloları oluşturmanın iyi bir yolunu keşfettim.ActiveRecord :: Migration'ın create_join_table davranışı nedir?

rails g migration CreateJoinTable table1 table2 

Bu bu harika gizemli yöntem ne merak ediyorum yöntemi create_join_table

kullanan bir ActiveRecord::Migration üretir. Tablo1 yabancı anahtar için bir sütun ve table2 yabancı anahtar için bir sütun olan bir tablo (muhtemelen bir id alanı olmadan) yapar, ama tablo başka özellikleri var mı? Birleştirme tabloları için alışkanlığım her zaman her iki sütunda da benzersiz bir dizin eklemekti, böylece tablo1'deki bir kayıt ile tablo2'deki bir kayıt arasındaki ilişki iki kez girilemez.

Soruma aşağı bakıyorum: create_join_table kullanıyorsam, bu benzersiz dizini eklemeye devam etmem gerekir mi yoksa bu yöntem benim için bunu yapar mı (bence gerekir)?

documentation I usually look at bu tür ayrıntılara girmez.

cevap

0

Bu, anlatımda anlattığım temellerden başka bir şey yapmadı. herhangi blokta olmadan denilen

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :posts, :users 
    add_index :posts_users, [:post_id, :user_id], unique: true, name: 'index_posts_users' 
    end 
end 
3

, create_join_table bir masayı ile oluşturur: Ben sadece göç koşu ve benzersiz dizin bunu elde etmek için ne ilgilenenler için db/schema.rb

biter, görerek öğrendim iki birleştirilen tabloya başvuran iki yabancı anahtar. Ancak, herhangi bir ek işlem yapmak için yöntemi çağırdığınızda (örneğin, örneğin dizin ekleyerek) bir bloğu iletebilirsiniz. Raylar doc Gönderen:

create_join_table :products, :categories do |t| 
    t.index :product_id 
    t.index :category_id 
end 

create_join_table documentation göz at.

create_join_table kodunu en altta kontrol edebilirsiniz (Kaynak: show).

1

SchemaStatements#create_join_table() sadece ... herhangi fantezi endeksler vb olmadan masaya katılmak oluşturur Yani iki alan üzerinde benzersiz kısıtlamayı kullanmak istiyorsanız böyle bir şey yapmak zorunda:

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :posts, :users do |t| 
     t.integer :post_id, index: true 
     t.integer :user_id, index: true 
     t.index [:post_id, :user_id], name: 'post_user_un', unique: true 
    end 
    end 
end 

da lütfen unutmayın create_join_table varsayılan olarak id alanını oluşturmuyor.