কারাগারের স্থানান্তর: বিকল্প নামের সাথে টি?


121

সুতরাং আমার কাছে একটি বিদ্যালয়ে কোর্সগুলির জন্য এর মতো একটি ক্রিয়েট টেবিল রয়েছে:

create_table :courses do |t|
  t.string :name
  t.references :course
  t.timestamps
end

তবে আমি এটির মতো আরও দুটি কোর্সের রেফারেন্স চাই:

has_many :transferrable_as # A Course
has_many :same_as          # Another Course

আমি কি নিম্নলিখিত বলতে পারি?

t.references :transferrable_as, :as=> :course

উত্তর:


161

আপনি প্রাথমিক মাইগ্রেশন / কলাম সংজ্ঞায় এটি করতে পারেন (কমপক্ষে বর্তমানে রেল 5 এ রয়েছেন):

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}

10
এটি রেল 5.1 এ কাজ করে এবং অন্যান্য পরামর্শগুলির মধ্যে কোনওটিই করে না। এটি অনেক পরিষ্কার, এবং সঠিক অনুভব করে।
স্টেফেনমুরডোক

2
আমি রেলগুলি 5.1.4 ব্যবহার করি তবে এটি কার্যকর হয় না। আমি যখন foreign_keyএইভাবে টেবিল তৈরির কোনও বিকল্প নির্দিষ্ট করি , তখন এটি ত্রুটি উত্থাপন করে বলেছিল যে আমি যে টেবিলটি তৈরি করছি তার অস্তিত্ব নেই ... তাই আমি সন্দেহ করি যে এটি সত্যই অফিশিয়াল এপিআই দ্বারা সমর্থিত নয়।
Quv

3
আমি আরও পড়লাম যে indexবিদেশী কীগুলিতে ইতিমধ্যে যুক্ত হয়ে গেছে রেলস স্ট্যাকওভারফ্লো
জোনাথন রেইস

98

আপনি এটি এইভাবে করতে পারেন:

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as
  t.references :same_as
  t.timestamps
end

বা t.belongs_toজন্য একটি উপাধি হিসাবে ব্যবহারt.references

আপনি foreign_key: trueএই দুটি রেফারেন্স লাইনে যুক্ত করতে পারবেন না । আপনি যদি তাদের ডাটাবেস পর্যায়ে বিদেশী কী হিসাবে চিহ্নিত করতে চান তবে আপনার এটির সাথে মাইগ্রেশন হওয়া দরকার:

add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id

হালনাগাদ

5.1 বা তার বেশি রেলগুলিতে আপনি create_tableব্লকের মাইগ্রেশনে বিদেশী কীটি যুক্ত করতে পারেন :

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as, foreign_key: { to_table: 'courses' }
  t.references :same_as, foreign_key: { to_table: 'courses' }
  t.timestamps
end

5
foreign_key: trueরেফারেন্স লাইনে যুক্ত করতে না পারার অংশটিই আমাকে ট্রিপ করছিল। এগুলি যুক্ত করা add_foreign_keyএবং কলামটির নাম নির্দিষ্ট করে সেই কৌশলটি করেছেন।
ম্যাথু ক্লার্ক

এটি কি রেলের বাক্সের বাইরে কাজ করে? স্ট্যাকওভারফ্লো.com / a / 22384289 / 239657 অনুসারে , এই রত্নটির প্রয়োজন schema_plus। রেলের ' অ্যাড- রেফারেন্স ডক্স একটি উল্লেখ করে না: রেফারেন্স বিকল্পগুলি mention
বেনি চেরনিয়াভস্কি-পাসকিন

1
আমি নিম্নলিখিত করছি না কি references:বিকল্প (যেমন বিরোধিতা জন্য t.references, foreign_key বিবেচনার সঙ্গে যে না শুধুমাত্র মডেল স্তরের উপর প্রাসঙ্গিক হবে দ্বারা যত্ন নেয়া হচ্ছে add_foreign_key?
MCB

1
@ এমসিবি t.referencesবলছে "এই সারণিতে এমন একটি ক্ষেত্র যুক্ত করুন যা অন্য টেবিলের প্রাথমিক কী" " references:বিকল্প বলা হয়েছে যে সব যা টেবিল এটি একটি প্রাথমিক কী (প্রয়োজন হলে মাঠের নামে পরিষ্কার হয় না) হয়। add_foreign_keyফাংশন জারি উল্লেখ সততা এখানে ডাটাবেসের বলে।
টবি 1 কেনবি

2
@ এমসিবির এতক্ষণ পরেও বুঝতে পেরেছি আপনি ঠিক ছিলেন। উপরে আপনার প্রথম মন্তব্যটি ঠিক ঠিক - add_foreign_keyলাইনগুলি কীসের একটি বিদেশী কী কী তা ডাটাবেসকে জানাতে যত্ন নেয়। references:পরামিতি কিছুই করছে।
টবি 1 কেনোবি

13

আমি মনে করি যে এই থ্রেডটির আলাদা আলাদা রেল-ইশ উপায় রয়েছে: স্ক্যাফোল্ডিং অ্যাক্টিভেকর্ড: একই ডেটা টাইপের দুটি কলাম

মাইগ্রেশনে:

t.belongs_to: স্থানান্তরযোগ্য_ও as

t.belongs_to: same_as


1
কিন্তু ডিবি কীভাবে জানতে পারে যে কোন বিদেশী কীটি টেবিলের সাথে লিঙ্ক করবে? আমি পোস্টগ্রিস ডাটাবেসের সাথে এটি চেষ্টা করছি এবং এটি আমাকে একটি ত্রুটি দিচ্ছে PG::UndefinedTable: ERRORএটি অস্তিত্বহীন টেবিলের সাথে বিদেশী কী বাধা যুক্ত করার চেষ্টা করছে।
টবি 1 কেনবি

কেস যে কেউ হতাশ হয়, belongs_toঠিক হয় উপনাম করার referencesএবং তাই সঠিক একই কার্যকারিতা থাকে।
জেসন সোয়েট


3

আমি বিকল্পটি referencesগ্রহণ করে বলে মনে করি না :as, তবে আপনি নিজের কলামগুলি নিজেই তৈরি করতে পারেন ...

create_table :courses do |t| 
  t.string  :name 
  t.integer :course1_id
  t.integer :course2_id 
  t.timestamps 
end 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.