টেস্টে যোগদানের_আর_বেলং_স_মানুষের জন্য রেল স্থানান্তর


122

script/generate migrationকোনও has_and_belongs_to_manyসম্পর্কের জন্য যোগদানের টেবিল তৈরি করতে কীভাবে করব ?

অ্যাপ্লিকেশনটি রেলগুলি ২.৩.২ এ চলেছে, তবে আমার কাছেও ব্যর্থতা রয়েছে ৩.০.৩।

উত্তর:


228

কোথায়:

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|

16
এটিই কেবলমাত্র উত্তর যা আসলে প্রশ্নের উত্তর দেয়।
pingu

8
@ পিপু: কমপক্ষে 3..২-এ কাজ করা ছাড়া এটি কার্যকর হয় না। উত্পন্ন মাইগ্রেশন ফাইলটি ফাঁকা।
হফম্যানক


2
@ hoffmanc আপনি কোনও ক্ষেত্র নির্দিষ্ট না করলে এটি একটি খালি মাইগ্রেশন ফাইল তৈরি করবে। আপনার যদি অবশ্যই রেলগুলি মাইগ্রেশন ফাইলে স্বয়ংক্রিয়ভাবে যুক্ত করতে চান তবে আপনাকে অবশ্যই ক্ষেত্রগুলি নির্দিষ্ট করতে হবে।
অ্যান্ড্রু

1
হ্যালো, আমি rails generate migration CreateJoinTableTeacherStudent teacher studentপরিবর্তে চেষ্টা করছি rails generate migration CreateJoinTableStudentTeacher student teacher, এটি কি একই? টি (ইচার) এর আগে এস (টিউডেন্ট) এর দরকার কি?
zx1986

138

একটি 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

আরও তথ্য: রেল ডক্স

আপডেট হয়েছে ২০১০-১২-১-13 আমি আইডি এবং টাইমস্ট্যাম্পগুলি মুছে ফেলার জন্য এটি আপডেট করেছি ... মূলত MattDiPasqualeএবং nunopoloniaসঠিক: এখানে কোনও আইডি থাকা উচিত নয় এবং টাইমস্ট্যাম্প বা রেলগুলি has_and_belongs_to_manyকাজ করতে দেয় না ।


6
প্রকৃতপক্ষে, একটি যোগদানের টেবিলটিতে কেবলমাত্র দুটি রেফারেন্স কলাম থাকতে হবে এবং এতে আইডি বা টাইমস্ট্যাম্প কলাম থাকতে পারে না। আপনি যে লিঙ্কটি দিয়েছেন তা থেকে একটি has_and_belongs_to_many মাইগ্রেশনের আরও একটি ভাল উদাহরণ । আমি কমান্ড লাইন থেকে এটি করার একটি উপায় সন্ধান করছি script/generate migration...
ma11hew28

ঠিক আছে, এর টাইমস্ট্যাম্প থাকতে হবে না; আমি আমার উদাহরণে এটি markedচ্ছিক চিহ্নিত করেছি। আমি আইডি যোগ করার পরামর্শ দিচ্ছি, যদিও। এমন কিছু মামলা রয়েছে যেখানে আইডি বা টাইমস্ট্যাম্প কার্যকর হতে পারে। তবে আমি দৃ strongly়ভাবে আইডি সুপারিশ।
ডকোচ্যাট

ঠিক আছে. আইডিটি কার্যকর হবে এমন কোনও ক্ষেত্রে কী?
ma11 শেই 28

একটি উদাহরণ যদি সম্পর্কটি দেখার পক্ষে যথেষ্ট গুরুত্বপূর্ণ হয়। এটি বারবার সন্ধানের পরিবর্তে সম্পর্কের কাছাকাছি পার হয়ে ডেটাবাস অ্যাক্সেস দ্রুত করার জন্যও ব্যবহার করা যেতে পারে। এটি ডাটাবেস সমস্যা সমাধান সহজতর করে তোলে। বিশেষত যদি অন্য কলামগুলির আইডিগুলি সত্যই বেশি থাকে। Id: 54321-id: 67890 এর পরিবর্তে আইডিটিকে মনে রাখা আরও সহজ - তবে বলা হচ্ছে, যদি টেবিলটি সত্যিই বড় হয়ে যায় তবে আপনি প্রতিটি সম্পর্কের জন্য অন্য আইডি বরাদ্দ না করে স্থান বাঁচাতে সক্ষম হতে পারেন।
ডকটি

2
আমি মনে করি না মাল্টিকালম ইনডেক্স এটির জন্য সঠিক সমাধান। এটি নির্দিষ্ট আপেলগুলির সম্পর্কিত কমলাগুলি খুঁজে পেতে তবে অন্য কোনও উপায়ে নয় অনুসন্ধানের জন্য কাজ করবে। দুটি একক কলাম সূচী কোনও নির্দিষ্ট আপেল, কমলা সংমিশ্রণের অস্তিত্বের চেকের অল্প ক্ষতিতে উভয় দিকনির্দেশকে দক্ষতার সাথে জিজ্ঞাসা করার অনুমতি দেবে)।
জোসেফ লর্ড

14

বর্ণানুক্রমিক ক্রমে আপনি সংযুক্ত করতে চান এমন দুটি মডেলের নাম আপনার সারণীতে রাখা উচিত এবং দুটি মডেলের আইডি টেবিলের মধ্যে রেখে দেওয়া উচিত। তারপরে প্রতিটি মডেলকে একে অপরের সাথে সংযুক্ত করে মডেলগুলিতে সমিতি তৈরি করুন।

এখানে একটি উদাহরণ:

# 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: এর মাধ্যমে ব্যবহার করা উচিত


6

শীর্ষের উত্তরটি একটি সংমিশ্রিত সূচক দেখায় যা আমি বিশ্বাস করি না কমলা থেকে আপেল সন্ধান করতে ব্যবহৃত হবে।

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

রেল 4 এ, আপনি সাধারণ ব্যবহার করতে পারেন

create_join_table: table1s,: table2s 2

এটা সব।

সাবধানতা: আপনার অবশ্যই টেবিল 1 অফার করতে হবে, টেবিল 2 অক্ষরের সাথে হবে meric


এটি আপ টু ডেট সলিউশন। দ্রষ্টব্য, যোগদানের টেবিলটি একটি মডেল হিসাবে অ্যাক্সেসযোগ্য নয়, তবে যুক্ত_ডেমি উভয় টেবিলে সেটআপ করা has_and_belongs_to_many সম্পর্কের মাধ্যমে through
টেলরড ওয়েব সাইটগুলি

1

আমি করতে পছন্দ করি:

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টেবিল তৈরির মতো একই মাইগ্রেশনে রাখলে ব্যর্থ হবে।
আদিব সাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.