রেল 4 এ একটি রেফারেন্স কলাম মাইগ্রেশন যুক্ত করুন


310

একজন ব্যবহারকারীর অনেকগুলি আপলোড রয়েছে। আমি uploadsটেবিলে একটি কলাম যুক্ত করতে চাই যা উল্লেখ করে user। স্থানান্তর কেমন হবে?

আমার যা আছে তা এখানে। আমি নিশ্চিত না যে আমার (1) :user_id, :intবা (2) ব্যবহার করা উচিত :user, :references। আমি (2) কাজ করে কিনা তাও নিশ্চিত নই। এটি "রেল" উপায়ে করার চেষ্টা করছি।

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

প্রবন্ধগুলি প্রাসঙ্গিক প্রশ্নগুলি ব্যতীত ৩. রেলগুলি 3 মাইগ্রেশন: রেফারেন্স কলাম যুক্ত করা হচ্ছে?

উত্তর:


706

রেলস 4.x

আপনি যখন ইতিমধ্যেই আছে users এবং uploadsটেবিল ও করতে ইচ্ছুক নতুন সম্পর্কের যোগ তাদের মধ্যে।

আপনাকে যা করতে হবে তা হ'ল: নিম্নলিখিত কমান্ডটি ব্যবহার করে একটি মাইগ্রেশন তৈরি করুন:

rails g migration AddUserToUploads user:references

যা মাইগ্রেশন ফাইল হিসাবে তৈরি করবে:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
  end
end

তারপরে, ব্যবহার করে মাইগ্রেশন চালান rake db:migrate। এই স্থানান্তরণের নামে একজন নতুন কলাম যোগ করার যত্ন নিতে হবে user_idথেকে uploadsসারণী (উল্লেখ idকলাম usersটেবিল), প্লাস এটি নতুন কলাম উপর একটি সূচক যোগ করা হবে।

আপডেট করুন [4..২ রেলের জন্য]

রেফারেন্সিয়াল অখণ্ডতা বজায় রাখতে কারাগুলিকে বিশ্বাস করা যায় না; সম্পর্কিত ডেটাবেসগুলি এখানে আমাদের উদ্ধারে আসে। এর অর্থ হ'ল আমরা নিজেরাই ডাটাবেস স্তরে বিদেশী কী বাধা যুক্ত করতে পারি এবং নিশ্চিত করতে পারি যে ডাটাবেস এই সেটটি রেফারেন্সিয়াল অখণ্ডতা লঙ্ঘন করে এমন কোনও ক্রিয়াকলাপ প্রত্যাখ্যান করবে। যেমন @ ইনফোয়েট মন্তব্য করেছেন, বিদেশী কীগুলির জন্য দেশীয় সমর্থন (রেফারেন্সিয়াল অখণ্ডতা) সহ 4.2 টি জাহাজের পোলগুলি । এটি প্রয়োজন হয় না তবে আপনি উপরে বর্ণিত রেফারেন্সটিতে আপনি বিদেশী কী (এটি খুব দরকারী হিসাবে) যুক্ত করতে চাইতে পারেন।

বিদ্যমান রেফারেন্সে বিদেশী কী যুক্ত করতে, বিদেশী কী যুক্ত করতে একটি নতুন স্থানান্তর তৈরি করুন:

class AddForeignKeyToUploads < ActiveRecord::Migration
  def change
    add_foreign_key :uploads, :users
  end
end

একটি বিদেশী কী ( সম্পূর্ণ 4.2 রেল) সহ সম্পূর্ণ ব্র্যান্ডের নতুন রেফারেন্স তৈরি করতে , নিম্নলিখিত কমান্ডটি ব্যবহার করে মাইগ্রেশন তৈরি করুন:

rails g migration AddUserToUploads user:references

যা মাইগ্রেশন ফাইল হিসাবে তৈরি করবে:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
    add_foreign_key :uploads, :users
  end
end

এটি টেবিলের user_idকলামে একটি নতুন বিদেশী কী যুক্ত করবে uploads। কীটি সারণীতে idকলামটি উল্লেখ করে users

দ্রষ্টব্য: এটি একটি রেফারেন্স যুক্ত করার সাথে যুক্ত যাতে আপনার এখনও প্রথমে একটি রেফারেন্স তৈরি করতে হবে তারপরে বিদেশী কী ( আপনি একই মাইগ্রেশন বা একটি পৃথক স্থানান্তর ফাইলে বিদেশী কী তৈরি করতে বেছে নিতে পারেন )। সক্রিয় রেকর্ড শুধুমাত্র একক কলাম বিদেশী কী সমর্থন ও বর্তমানে কেবল mysql, mysql2এবং PostgreSQLঅ্যাডাপ্টার সমর্থিত। অন্যান্য অ্যাডাপ্টারের মতো এটি ব্যবহার করে sqlite3দেখুন না R ইত্যাদি আপনার রেফারেন্সের জন্য রেল গাইড: বিদেশী কীগুলি দেখুন


8
অনেক ক্ষেত্রে বিদেশী কীটি যুক্ত করা ভাল। যোগ_আরক্ষ্য_কী ( ails.২ রেয়েল )
পোয়রআর

18
আমি বিশ্বাস করি আপনি সমস্ত এক লাইনে করতে পারেন: যোগ_প্রকাশ: আপলোডস: ব্যবহারকারী, সূচক: সত্য, বিদেশী_কি: সত্য @
কির্তি

32
এখন, যদি আপনি মাইগ্রেশনের জন্য বিশেষ জেনারেটর সিনট্যাক্স ব্যবহার করেন, তবে 4.2 টি রেল স্বয়ংক্রিয়ভাবে সঠিক বিদেশী কী সীমাবদ্ধতা অন্তর্ভুক্ত করে সঠিক স্থানান্তর তৈরি করবে। উপযুক্ত মাইগ্রেশন rails g migration AddUserToUploads user:referencesউত্পাদন করে add_reference :uploads, :user, index: true, foreign_key: true
jrhorn424

10
...index: true, foreign_key: trueপরিবর্তে ও লাইন ব্যবহার করুন add_foreign_key
ওয়াশিংটন বোটেলহো

2
কেন আমরা প্রয়োজন উভয়েই না foreign_keyএবং t.reference? t.referenceমূলত foriegn_key+ এর সমতুল্য নয় index?
জিওবয়

187

রেল 5

মাইগ্রেশন তৈরি করতে আপনি এখনও এই আদেশটি ব্যবহার করতে পারেন:

rails g migration AddUserToUploads user:references

মাইগ্রেশনটি আগের থেকে কিছুটা আলাদা দেখায় তবে এখনও কাজ করে:

class AddUserToUploads < ActiveRecord::Migration[5.0]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

মনে রাখবেন এটি :userনা, নেই:user_id


2
নাম-ব্যবধানে ক্লাস, মত জন্য Local::Userপরিবর্তে Userপছন্দ কর কিছু rails g migration AddLocalUserToUploads user:references
কা মোক

3
এটি কি স্বয়ংক্রিয়ভাবে যুক্ত হয়:index
সারওয়ানবালাগী রামচন্দ্রন

4
@ জেক হ্যাঁ, মাইগ্রেশনটি চালান এবং আপনার স্কিমাটি পরীক্ষা করুন, এটির মতো কিছু বলা উচিতt.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
মিরর 318

1
হ্যাঁ, আমি যখন ম্যানুয়ালি মাইগ্রেশনে অ্যাড_ইনডেক্স যুক্ত করেছি তখন আমি একটি "সূচক বিদ্যমান" ত্রুটি পেয়েছি: পি @ মিরর 318
সারওয়ানবালাগী রামচন্দ্রন

2
আমরা যোগ করা উচিত belongs_to :userমধ্যে Uploadতাই আমরা ব্যবহার করতে পারেন, বর্গ upload.userব্যবহারকারী উদাহরণস্বরূপ জন্য।
উইট

17

আপনি যদি অন্য বিকল্প পদ্ধতি upএবং downপদ্ধতিটি পছন্দ করেন তবে এটি ব্যবহার করে দেখুন:

  def up
    change_table :uploads do |t|
      t.references :user, index: true
    end
  end

  def down
    change_table :uploads do |t|
      t.remove_references :user, index: true
    end
  end

9

[রেল ৫ ব্যবহার করে]

মাইগ্রেশন উত্পন্ন করুন:

rails generate migration add_user_reference_to_uploads user:references

এটি মাইগ্রেশন ফাইল তৈরি করবে:

class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

এখন আপনি যদি স্কিমা ফাইলটি পর্যবেক্ষণ করেন তবে আপনি দেখতে পাবেন যে আপলোড সারণিতে একটি নতুন ক্ষেত্র রয়েছে। এর মতো কিছু: t.bigint "user_id"বা t.integer "user_id"

স্থানান্তর ডাটাবেস:

rails db:migrate

1
এই উত্তরটি @ Mirror318 এর উত্তরটির সদৃশ বলে মনে হচ্ছে। আপনি যদি মনে করেন যে এটি থেকে কিছু হারিয়ে গেছে তবে দয়া করে উপরের উত্তরে মন্তব্য করুন। ধন্যবাদ।
এম হাবিব


7

কারও যদি একই সমস্যা হয় তবে ডকুমেন্ট করতে ...

আমার পরিস্থিতিতে আমি :uuidক্ষেত্রগুলি ব্যবহার করছি এবং উপরের উত্তরগুলি আমার ক্ষেত্রে কাজ করে না, কারণ রেল 5 এর :bigintপরিবর্তে ব্যবহার করে একটি কলাম তৈরি করছে :uuid:

add_column :uploads, :user_id, :uuid
add_index :uploads, :user_id
add_foreign_key :uploads, :users

এটি ঘটছে তাও অনেক পরিষ্কার r তবে হ্যাঁ ইউইউডি এখন স্ট্যান্ডার্ড হওয়া উচিত।
হাদিস

2

একটি মাইগ্রেশন ফাইল তৈরি করুন

rails generate migration add_references_to_uploads user:references

ডিফল্ট বিদেশী কী নাম

এটি একটি বিদেশী কী হিসাবে আপলোড টেবিলটিতে একটি ইউজার_আইডি কলাম তৈরি করবে

class AddReferencesToUploads < ActiveRecord::Migration[5.2]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

ব্যবহারকারী মডেল:

class User < ApplicationRecord
  has_many :uploads
end

মডেল আপলোড করুন:

class Upload < ApplicationRecord
  belongs_to :user
end

বিদেশী কী নামটি কাস্টমাইজ করুন:

add_reference :uploads, :author, references: :user, foreign_key: true

এটি বিদেশী কী হিসাবে আপলোড টেবিলগুলিতে একটি লেখক_আইডি কলাম তৈরি করবে।

ব্যবহারকারী মডেল:

class User < ApplicationRecord
  has_many :uploads, foreign_key: 'author_id'
end

মডেল আপলোড করুন:

class Upload < ApplicationRecord
  belongs_to :user
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.