কারাগুলিতে_আর_বেলং_স_মনি মাইগ্রেশন রয়েছে


119

আমার দুটি মডেল রয়েছে restaurantএবং userআমি একটি has_and_belongs_to_many সম্পর্ক সম্পাদন করতে চাই।

আমি ইতিমধ্যে মডেল ফাইলগুলিতে goneুকেছি has_and_belongs_to_many :restaurantsএবংhas_and_belongs_to_many :users

আমি ধরে নিচ্ছি এই মুহুর্তে আমার কাছে রেল 3 এর মতো কিছু করতে সক্ষম হওয়া উচিত:

rails generate migration ....

তবে আমি যা চেষ্টা করেছি সেগুলি ব্যর্থ বলে মনে হচ্ছে। আমি নিশ্চিত যে এটি সত্যিই এমন কিছু সহজ যা আমি রেলগুলিতে নতুন তাই আমি এখনও শিখছি।

উত্তর:


260

বর্ণানুক্রমিক ক্রমে আপনাকে কেবল একটি restaurant_idএবং user_id(কোনও প্রাথমিক কী নয়) দিয়ে পৃথক যোগদানের টেবিল যুক্ত করতে হবে

প্রথমে আপনার স্থানান্তর চালান, তারপরে উত্পন্ন মাইগ্রেশন ফাইল সম্পাদনা করুন।

রেল 3

rails g migration create_restaurants_users_table

রেল 4 :

rails g migration create_restaurants_users

রেল 5

rails g migration CreateJoinTableRestaurantUser restaurants users

ডক্স থেকে :

এখানে এমন একটি জেনারেটর রয়েছে যা জয়েন্ট টেবিলের অংশের অংশ হলে জোড় টেবিল তৈরি করবে:


আপনার মাইগ্রেশন ফাইল (নোট করুন :id => false; এটিই প্রাথমিক কী তৈরিতে বাধা দেয়):

রেল 3

class CreateRestaurantsUsers < ActiveRecord::Migration
  def self.up
    create_table :restaurants_users, :id => false do |t|
        t.references :restaurant
        t.references :user
    end
    add_index :restaurants_users, [:restaurant_id, :user_id]
    add_index :restaurants_users, :user_id
  end

  def self.down
    drop_table :restaurants_users
  end
end

রেল 4

class CreateRestaurantsUsers < ActiveRecord::Migration
  def change
    create_table :restaurants_users, id: false do |t|
      t.belongs_to :restaurant
      t.belongs_to :user
    end
  end
end

t.belongs_toস্বয়ংক্রিয়ভাবে প্রয়োজনীয় সূচকগুলি তৈরি করবে। def changeএকটি ফরোয়ার্ড বা রোলব্যাক স্থানান্তর স্বয়ংক্রিয়ভাবে সনাক্ত করবে, উপরে / ডাউনের প্রয়োজন হবে না।

রেল 5

create_join_table :restaurants, :users do |t|
  t.index [:restaurant_id, :user_id]
end

দ্রষ্টব্য: একটি কাস্টম টেবিল নামের জন্য একটি অপশনও রয়েছে যা তৈরি_জয়েন_ টেবিল তৈরি করতে প্যারামিটার হিসাবে পাস হতে পারে table_nameডক্স থেকে

ডিফল্টরূপে, যোগদানের সারণির নাম বর্ণমালা অনুসারে তৈরি_জয়াইন_সেবযোগ্য প্রদান করা প্রথম দুটি যুক্তির মিল থেকে আসে union সারণীর নাম কাস্টমাইজ করতে, একটি: টেবিল_নাম বিকল্প সরবরাহ করুন:


8
@ ডেক্স - কৌতূহলের বাইরে, আপনি কি ব্যাখ্যা করতে পারেন যে আপনি বিপরীতমুখী কলাম ক্রম দিয়ে সংজ্ঞায়িত দ্বিতীয় যৌগিক সূচকটি কেন ব্যবহার করছেন? আমি এই ছাপে ছিলাম যে কলামের আদেশটি কোনও ব্যাপার নয়। আমি ডিবিএ নই, কেবল নিজের বোঝাপড়াটি আরও এগিয়ে নিতে চাই। ধন্যবাদ!
প্লেইঞ্জিম্বো

11
@ জিম্বো আপনার এটির দরকার নেই, এটি আপনার প্রশ্নের উপর নির্ভর করে। সূচকগুলি বাম থেকে ডানে পড়ে তাই আপনি যদি সন্ধান করছেন তবে প্রথমটি দ্রুততম হবে restaurant_id। দ্বিতীয়টি যদি আপনি অনুসন্ধান করে থাকেন তবে সহায়তা করবে user_id। আপনি যদি উভয়টিতে অনুসন্ধান করে থাকেন তবে আমি মনে করি যে কেবলমাত্র একটি প্রয়োজনের জন্য ডাটাবেসটি যথেষ্ট স্মার্ট হবে। সুতরাং আমি অনুমান করি যে দ্বিতীয়টি আসলেই সংঘবদ্ধ হওয়ার দরকার নেই। এটি আরও একটি উদাহরণ ছিল। এটি যদিও একটি রেলের প্রশ্ন ছিল, সুতরাং ডিবি বিভাগে পোস্ট করা আরও সম্পূর্ণ উত্তর পেতে পারে।
ডেক্স

3
দ্বিতীয় সূচকের কিছুটা বাড়াবাড়ি রয়েছে - যতক্ষণ আপনি রেস্তোঁরা_আইডি এবং ব্যবহারকারী_আইডি উভয়কেই জিজ্ঞাসা করছেন ততক্ষণ আপনার এসকিউএল-এ তাদের ক্রমের কোনও গুরুত্ব নেই এবং প্রথম সূচকটি ব্যবহার করা হবে। আপনি যদি কেবল রেস্তোঁরা_ইডে অনুসন্ধান করে থাকেন তবে এটি ব্যবহার করা হবে। দ্বিতীয় সূচকটি কেবলমাত্র চালু থাকতে হবে: ইউজার_আইডি, এবং এমন ক্ষেত্রে ব্যবহৃত হবে যেখানে আপনি কেবল ব্যবহারকারী_আইডিতে অনুসন্ধান করছেন (যা প্রথম সূচকটি তার কীগুলির ক্রমের কারণে কার্যকর হবে না)।
ইয়ার্ডবয়

13
রেল 4 এ মাইগ্রেশন অবশ্যই শেষে টেবিলrails g migration create_restaurants_users ছাড়াই থাকতে হবে ।
FA11enAngel

6
আপনি রেল ছের স্থানান্তর ক্রেইটজয়াইনটবেলস্টেস্টনার ব্যবহারকারী রেস্তোরাঁ ব্যবহার করতে পারেন। পড়ুন guides.rubyonrails.org/migrations.html#creating-a-join-table
eKek0

36

উত্তরগুলি এখানে বেশ তারিখের। রেল 4.0.০.২ অনুসারে, আপনার স্থানান্তরগুলি ব্যবহার করেcreate_join_table

মাইগ্রেশন তৈরি করতে, চালান:

rails g migration CreateJoinTableRestaurantsUsers restaurant user

এটি নিম্নলিখিত উত্পন্ন করবে:

class CreateJoinTableRestaurantsUsers < ActiveRecord::Migration
  def change
    create_join_table :restaurants, :users do |t|
      # t.index [:restaurant_id, :user_id]
      # t.index [:user_id, :restaurant_id]
    end
  end
end

আপনি যদি এই কলামগুলিকে সূচী করতে চান তবে সংশ্লিষ্ট লাইনগুলিকে অস্বচ্ছন্দ করুন এবং আপনি যেতে ভাল!


2
আমি সাধারণত সূচী রেখাগুলির মধ্যে কোনওটিকেই অসুবিধে করতে এবং এতে যুক্ত unique: trueকরতে চাই। এটি সদৃশ সম্পর্ক তৈরি হওয়া রোধ করবে।
টোবি 1 কেনবি

26

যোগদানের টেবিলটি তৈরি করার সময়, দুটি টেবিলটি মাইগ্রেশন নাম / শ্রেণিতে বর্ণানুক্রমিক ক্রমে তালিকাভুক্ত করার প্রয়োজনীয়তার দিকে মনোযোগ দিন । যদি আপনার মডেলের নামগুলি একই রকম হয়, যেমন "abc" এবং "abb" এটি সহজেই আপনাকে কামড় দিতে পারে। আপনি যদি চালানো হয়

rails g migration create_abc_abb_table

আপনার সম্পর্কগুলি প্রত্যাশার মতো কাজ করবে না । আপনার অবশ্যই ব্যবহার করা উচিত

rails g migration create_abb_abc_table

পরিবর্তে.


1
কোনটি প্রথম আসে? ফু বা ফু_বার?
বি সেভেন

1
একটি রেল কনসোলে দৌড়ে: ["foo_bar", "foo", "foo বার"] sort
শাদোয়াথ

6

এইচএবিটিএম সম্পর্কের জন্য আপনার একটি যোগদান টেবিল তৈরি করতে হবে। এখানে কেবল যোগদানের টেবিল রয়েছে এবং সেই টেবিলটির কোনও আইডি কলাম থাকা উচিত নয়। এই স্থানান্তর চেষ্টা করুন।

def self.up
  create_table :restaurants_users, :id => false do |t|
    t.integer :restaurant_id
    t.integer :user_id
  end
end

def self.down
  drop_table :restaurants_users
end

আপনাকে অবশ্যই এই সম্পর্কের রেল গাইড টিউটোরিয়াল পরীক্ষা করতে হবে


আমি মনে করি না যে আপনার একটি মডেল প্রয়োজন এবং আমি এইচএবিটিএম সম্পর্কের জন্য কোনও মডেল প্রয়োজনের লিঙ্কটিতে কিছুই দেখতে পাচ্ছি না।
বি সেভেন

1
উত্পন্ন প্রশ্নগুলির গতি বাড়ানোর জন্য, আইডি ক্ষেত্রগুলিতে সূচকগুলি যুক্ত করুন।
মার্টিন রবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.