2015-08-25 12 views
6

मैंने अपने रेल ऐप में अपने एचएबीटीएम संबंधों के लिए जॉइन टेबल बनाने के लिए एक अच्छा तरीका खोजा है।ActiveRecord :: माइग्रेशन के create_join_table का व्यवहार क्या है?

rails g migration CreateJoinTable table1 table2 

यह एक ActiveRecord::Migration कि विधि create_join_table

मैं सोच रहा हूँ क्या इस अद्भुत रहस्यमय विधि करता रोजगार उत्पन्न करता है। मुझे लगता है कि यह एक टेबल बनाता है (शायद id फ़ील्ड के बिना) जिसमें तालिका 1 विदेशी कुंजी के लिए एक कॉलम है और तालिका 2 विदेशी कुंजी के लिए एक कॉलम है, लेकिन क्या तालिका में कोई अन्य विशेषताएं हैं? टेबल में शामिल होने की मेरी आदत हमेशा उन कॉलमों में एक अद्वितीय इंडेक्स जोड़ना है ताकि तालिका 1 में रिकॉर्ड और तालिका 2 में रिकॉर्ड के बीच संबंध दो बार दर्ज नहीं किया जा सके।

मेरा प्रश्न नीचे उबलता है: यदि मैं create_join_table का उपयोग करता हूं तो क्या मुझे उस अद्वितीय अनुक्रमणिका को जोड़ने की आवश्यकता है, या यह तरीका मेरे लिए ऐसा करता है (मुझे लगता है कि यह चाहिए)?

documentation I usually look at इस तरह के विवरण में नहीं जाता है।

उत्तर

0

यह पता चला है कि यह प्रश्न में वर्णित मूलभूत बातें से कहीं अधिक नहीं करता है। मैं बस प्रवास चल रहा है और क्या db/schema.rb

रुचि रखने वालों के लिए में समाप्त होता है, अद्वितीय सूचकांक ऐसा करने के पाने के लिए देख कर यह पता चला:

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 बस के साथ एक मेज बनाता है दो विदेशी कुंजी दो शामिल तालिकाओं का जिक्र करते हैं।

हालांकि, जब आप किसी अतिरिक्त ऑपरेशन करने के लिए विधि को कॉल करते हैं तो आप वास्तव में एक ब्लॉक पास कर सकते हैं (कहें, उदाहरण के लिए अनुक्रमणिका जोड़ना)। रेल डॉक से:

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

create_join_table documentation पर एक नज़र डालें।

आप नीचे create_join_table कोड देख सकते हैं (पर क्लिक करें स्रोत: दिखाएं)।

1

SchemaStatements#create_join_table() केवल किसी भी फैंसी अनुक्रमित आदि, बिना तालिका में शामिल होने बनाता है ... तो तुम दो क्षेत्रों पर विशिष्टता बाधा उपयोग करना चाहते हैं तो आप इस तरह कुछ करना है:

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 

कृपया यह भी ध्यान दें कि डिफ़ॉल्ट रूप से create_join_tableid फ़ील्ड नहीं बनाता है।

संबंधित मुद्दे