जवाबों:
कहाँ पे:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
तथा
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
रेल के लिए 4:
rails generate migration CreateJoinTableStudentTeacher student teacher
रेल के लिए 3:
rails generate migration students_teachers student_id:integer teacher_id:integer
रेल के लिए <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(तालिका का नाम सूचीबद्ध करें दोनों वर्णमाला क्रम में तालिकाओं में शामिल हों)
और उसके बाद केवल 3 और उससे नीचे की रेल के लिए, आपको अपना जनरेट किया हुआ माइग्रेशन संपादित करने की आवश्यकता होती है ताकि कोई आईडी फ़ील्ड न बने:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
बजाय कोशिश कर रहा हूँ rails generate migration CreateJoinTableStudentTeacher student teacher
, वही है? S (tudent) को T (प्रत्येक) से पहले की आवश्यकता है?
एक has_and_belongs_to_many
तालिका को इस प्रारूप से मेल खाना चाहिए। मैं मान रहा हूं कि दो मॉडल has_and_belongs_to_many
डीबी में पहले से शामिल हैं: apples
और oranges
:
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables. Don't use the
# unique if you allow duplicates.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
आप का उपयोग करते हैं :unique => true
सूचकांक पर है, तो आप (rails3 में) पास करना चाहिए :uniq => true
करने के लिए has_and_belongs_to_many
।
अधिक जानकारी: रेल डॉक्स
2010-12-13 तक मैंने आईडी और टाइमस्टैम्प को हटाने के लिए इसे अपडेट कर दिया है ... मूल रूप से MattDiPasquale
और nunopolonia
सही हैं: एक आईडी नहीं होनी चाहिए और टाइमस्टैम्प या रेल नहीं होनी चाहिए has_and_belongs_to_many
।
script/generate migration
...
आपको तालिका को उन 2 मॉडलों का नाम देना चाहिए जिन्हें आप वर्णानुक्रम से कनेक्ट करना चाहते हैं और तालिका में दो मॉडल आईडी डालते हैं। फिर मॉडल में संघों को बनाने के लिए प्रत्येक मॉडल को एक-दूसरे से कनेक्ट करें।
यहाँ एक उदाहरण है:
# in migration
def self.up
create_table 'categories_products', :id => false do |t|
t.column :category_id, :integer
t.column :product_id, :integer
end
end
# models/product.rb
has_and_belongs_to_many :categories
# models/category.rb
has_and_belongs_to_many :products
लेकिन यह बहुत लचीला नहीं है और आपको has_many का उपयोग करने के बारे में सोचना चाहिए: के माध्यम से
शीर्ष उत्तर एक समग्र सूचकांक दिखाता है जो मुझे विश्वास नहीं है कि इसका उपयोग संतरे से सेब देखने के लिए किया जाएगा।
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables.
# This enforces uniqueness and speeds up apple->oranges lookups.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
# This speeds up orange->apple lookups
add_index(:apples_oranges, :orange_id)
मुझे यह जवाब मिला कि यह 'द डॉक्टर व्हाट' द्वारा उपयोगी और चर्चा के आधार पर निश्चित रूप से ऐसा है।
रेल 4 में, आप सरल उपयोग कर सकते हैं
create_join_table: table1s,: table2s
यही हे सब।
सावधानी: आपको अल्फ़ान्यूमेरिक के साथ तालिका 1, टेबल 2 को बंद करना होगा।
मुझे करना पसंद है:
rails g migration CreateJoinedTable model1:references model2:references
। इस तरह मुझे एक प्रवास मिलता है जो इस तरह दिखता है:
class CreateJoinedTable < ActiveRecord::Migration
def change
create_table :joined_tables do |t|
t.references :trip, index: true
t.references :category, index: true
end
add_foreign_key :joined_tables, :trips
add_foreign_key :joined_tables, :categories
end
end
मुझे इन स्तंभों पर अनुक्रमणिका पसंद है क्योंकि मैं अक्सर इन स्तंभों का उपयोग करके लुकअप करूंगा।
add_foreign_key
यदि टेबल बनाने वाले के समान ही माइग्रेशन में विफल हो जाएगा।