"রেফারেন্স" মাইগ্রেশনে কলামের নাম উল্লেখ করা হচ্ছে


124

আমি migrationঅন্য টেবিলের রেফারেন্স দিয়ে, রেলগুলিতে একটি করতে চাই । সাধারণত, আমি এমন কিছু করতাম:

add_column :post, :user, :references

এই নামে একটি কলাম তৈরি করে user_idpostsটেবিল। তবে কি, পরিবর্তে user_id, আমি কিছু চাই author_id? আমি এটা কিভাবে করবো?

উত্তর:


59

এটি ম্যানুয়ালি করুন:

add_column :post, :author_id, :integer

তবে এখন, আপনি যখন স্বনিযুক্ত-সংক্রান্ত বিবৃতিটি তৈরি করবেন তখন আপনাকে এটি সংশোধন করতে হবে, সুতরাং এখন আপনাকে কল করতে হবে

def post
    belongs_to :user, :foreign_key => 'author_id'
end

1
আমাকে কি কোনও সূচক যুক্ত করতে হবে না?
caarlos0

1
হ্যাঁ, মাইগ্রেশনে আপনাকে একটি সূচি তৈরি করতে হবে।
টম হ্যারিসন

1
রেল চিট - এটি সত্যই ডিফল্ট অনুসারে সূচি ব্যবহার করে না। এখন আপনি যদি সূচকগুলি চান (যা দুর্দান্ত ধারণা - তবুও রেলগুলি এগুলি সম্পূর্ণ উপেক্ষা করবে), আপনি অবশ্যই এগুলি যুক্ত করতে পারেন তার চেয়ে বেশি। আপনি সাধারণভাবে মাইগ্রেশন সম্পর্কিত আরও তথ্যের জন্য যে লিঙ্কটি আমি সংযুক্ত করেছি তা যাচাই করতে চাইবেন এবং আপনি সরাসরি নিজের মাইগ্রেশনে এসকিউএল কোড কল করা শেষ করতে পারেন। আমি এটিকে উপেক্ষা করার জন্য বলব, কারণ এটি রেলের কোনও সাধারণ অংশ নয়, আপনি এটির থেকে 0 টি কার্যকারিতা পাবেন, কারণ রেলগুলির ডিফল্ট উত্পন্ন এসকিউএল অনুসন্ধানগুলি এর কোনও সুবিধা নেয় না। লিঙ্ক
mschultz

হুম বুঝেছি। আপনাকে অনেক ধন্যবাদ!
caarlos0

schema_plusরত্ন ব্যবহার করে , t.references :category, index: true, foreign_key: true, references: :match_categoriesমাইগ্রেশন ফাইলেও আমার জন্য কাজ করেছিল।
এলকুইমিস্ট

251

রেল 5+ এর জন্য

প্রাথমিক সংজ্ঞা:

আপনি আপনার সংজ্ঞায়িত হয় Postমডেল টেবিল, আপনি সেট করতে পারেন references, indexএবং foreign_keyএক লাইন মধ্যে:

t.references :author, index: true, foreign_key: { to_table: :users }

আপডেট বিদ্যমান:

আপনি যদি কোনও বিদ্যমান সারণীতে রেফারেন্স যুক্ত করে থাকেন তবে আপনি এটি করতে পারেন:

add_reference :posts, :author, foreign_key: { to_table: :users }

দ্রষ্টব্য: এর জন্য ডিফল্ট মানটি indexসত্য।


প্রাথমিক সংজ্ঞা কি নালার অনুমতি দেবে? যদি তা না হয় তবে আপনি কী অযোগ্য বিকল্পটি জানেন?
ভেরপুলাস লিফানে

5
এই সংজ্ঞা nullএস। তাদের অনুমতি না দেওয়ার জন্য, সাধারণ বিকল্পটি যুক্ত করুন null: false
আশিতাকা

ধন্যবাদ। "প্রাথমিক সংজ্ঞা" এর জন্য, আমি মনে করি "সূচক: সত্য" প্রয়োজনীয় নয়। আমি এটির সাথে বা এটি ছাড়া একই স্কিমা পরিবর্তনটি পাই। কিছু মনে করো না; ঠিক শেষে আপনার নোটটি দেখেছি
জোয়

ধন্যবাদ, আমি এটিই খুঁজছিলাম!
ফিলিপ বি।

250

ইন পাগল 4.2+ আপনার কাছে সেট করতে পারেন বিদেশী কী ডিবি হিসেবে ভাল, যা একটি মহান ধারণা

সাধারণ সংঘের জন্য এটি t.referencesযুক্ত করার foreign_key: trueক্ষেত্রেও করা যেতে পারে তবে এই ক্ষেত্রে আপনার দুটি লাইন প্রয়োজন।

# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id

# The model
belongs_to :author, class_name: "User"

2
ধন্যবাদ, তবে প্রশ্নটি ট্যাগ রেইল 3, আমি কেবল সাহায্য করতে পেরে খুশি
বাস্তুতত্ত্ব

2
ওহ, আমি এটি লক্ষ্য করিনি। ঠিক আছে, এটি খুব কার্যকর হয়েছে। :)
বনহ

2
আমি যখন দেখলাম তখন প্রায় আশা ছেড়ে দিয়েছি! আপনাকে ধন্যবাদ @ পরিবেশবিদ!
ড্যান উইলিয়ামস

2
@Coologic, কেবলমাত্র একটি জিনিস যা আপনি যুক্ত করতে চান, অ্যাড_ফরগেইন_কি কেবল ৪.২+ রেল। ;)
ড্যান উইলিয়ামস

4
আমি নিশ্চিত না যে আপনার কলটিতে references: :usersবিকল্পটি প্রয়োজন add_reference। আমি এটি ডক্সে নথিভুক্ত দেখতে পাচ্ছি না এবং মনে হচ্ছে এটি ছাড়া এটি আমার শেষের দিকে কাজ করে।
জাকেরেগে

87

4 রেলগুলিতে , পোস্টগ্র্যাস্কল এবং স্কিমা_প্লাস রত্ন ব্যবহার করার সময় আপনি কেবল লিখতে পারেন

add_reference :posts, :author, references: :users

এটি একটি কলাম তৈরি করবে author_id, যা সঠিকভাবে উল্লেখ করে users(id)

এবং আপনার মডেল, আপনি লিখুন

belongs_to :author, class_name: "User"

দ্রষ্টব্য, একটি নতুন টেবিল তৈরি করার সময় আপনি এটি নীচে লিখতে পারেন:

create_table :things do |t| 
  t.belongs_to :author, references: :users 
end 

দ্রষ্টব্য: schema_plusসম্পূর্ণরূপে রত্নটি রেল 5+ এর সাথে সামঞ্জস্যপূর্ণ নয়, তবে এই কার্যকারিতাটি রত্ন স্কিমা_আউটো_ফরাইন_কিজ ( স্কিমা_প্লাসের অংশ) দ্বারা সরবরাহ করা হয় যা রেল 5 এর সাথে সামঞ্জস্যপূর্ণ।


28
এবং যদি আপনি ব্যবহার করছেন create_table:t.references :author, references: :users
মাইকেল রাদিওনভ

2
আপনার উত্তরে @ মাইকেলরাদিয়নভের মন্তব্য যুক্ত করা নিখুঁত করে তুলবে।
toxaq

2
আমি রেলগুলি ৪.১ উত্সের দিকে নজর রেখেছি, এবং :referencesআসলে কিছুই করার মতো কোনও প্রমাণ আমি পাই না ।
jes5199

1
হ্যাঁ আপনি ঠিক বলেছেন, আমি schema_plusযুগে যুগে রত্নটি ব্যবহার করে আসছি এবং এটি আসলে সেই কার্যকারিতা যুক্ত করছে। আমি আমার উত্তর অনুসারে সম্পাদনা করেছি।
নাথানভদা

2
6 রেলগুলিতে, মনে হয় সিনট্যাক্স t.references :col_name, references: other_table_nameঅতিরিক্ত রত্ন ইনস্টল না করে কাজ করে।
Qqwy

51

আপনি যদি কোনও বিদেশী কী ব্যবহার না করে থাকেন তবে অন্য টেবিলের আসল সারণির নাম কী তা বিবেচনাধীন নয়।

add_reference :posts, :author

রেল 5 হিসাবে, আপনি যদি কোনও বিদেশী কী ব্যবহার করেন তবে আপনি বিদেশী কী বিকল্পগুলির মধ্যে অন্য সারণির নাম উল্লেখ করতে পারেন। ( আলোচনার জন্য https://github.com/rails/rails/issues/21563 দেখুন )

add_reference :posts, :author, foreign_key: {to_table: :users}

রেল 5 এর আগে, আপনার আলাদা পদক্ষেপ হিসাবে বিদেশী কী যুক্ত করা উচিত:

add_foreign_key :posts, :users, column: :author_id

12
টো টেবিলটি বহুবচনের রূপ:{to_table: :users}
হফম্যানক

-3

ওরফে_ট্রিবিউট (নতুন নাম, পুরাতন নাম) খুব সহজ। কেবল আপনার মডেল এবং সম্পর্ক তৈরি করুন:

rails g model Post title user:references

তারপরে মডেলটি সম্পাদনা করুন এবং এর সাথে একটি অ্যাট্রিবিউট ওরফে যুক্ত করুন

alias_attribute :author, :user

এর পরে আপনি এই জাতীয় জিনিস চালাতে সক্ষম হবেন

Post.new(title: 'My beautiful story', author: User.first)

1
যখন আপনি অন্য মডেলটির একাধিক রেফারেন্স সংজ্ঞায়িত করার প্রয়োজন হয় তখন এটি কাজ করে না, উদাহরণস্বরূপ, পোস্ট (লেখক, সম্পাদক)
আলট্রাওজন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.