ব্যবহারকারীর ব্যবহার করে মডেল তৈরি করুন: রেফারেন্স বনাম user_id: পূর্ণসংখ্যা


176

আমি কীভাবে এমন একটি মডেল তৈরি করব যা অন্য মডেলের সাথে সম্পর্কিত I'm আমার বইটি মাইক্রোপোস্টকে ব্যবহারকারীর সাথে সংযুক্ত করতে এই বাক্য গঠনটি ব্যবহার করে:

rails generate model Micropost user_id:integer

তবে http://guides.rubyonrails.org/ এটিকে এটি করতে বলে:

rails generate model Micropost user:references

এই 2 দ্বারা উত্পন্ন স্থানান্তরগুলি পৃথক। এছাড়াও, প্রাক্তনদের জন্য, রেলগুলি কীভাবে জানতে পারে যে user_idএটি একটি বিদেশী কী রেফারেন্সিং user? ধন্যবাদ!

উত্তর:


190

আপনি মাইগ্রেশন চালানোর সময় উভয়ই একই কলাম তৈরি করবে। রেলস কনসোলে আপনি দেখতে পাচ্ছেন যে এটি এমন:

:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)

দ্বিতীয় কমান্ডটি belongs_to :userআপনার মাইক্রোপোস্ট মডেলটিতে একটি সম্পর্ক যুক্ত করে যেখানে প্রথমটি তা করে না। এই সম্পর্কটি নির্দিষ্ট করা হলে অ্যাক্টিভেকর্ডটি ধরে নেবে যে বিদেশী কীটি user_idকলামে রাখা হয়েছে এবং এটি Userনির্দিষ্ট ব্যবহারকারীকে তাত্ক্ষণিকভাবে নামকরণ করা মডেল ব্যবহার করবে ।

দ্বিতীয় কমান্ড নতুন user_idকলামে একটি সূচকও যুক্ত করে ।


1
দুটি টেবিলের রেফারেন্স সহ কোনও মডেল তৈরি করা কি সম্ভব
প্রবীণকুমার

নোট করুন যে এটি অন্যান্য মডেল (ব্যবহারকারী) এ একটি has_many সংযুক্তি যুক্ত করে না, যা আপনি পাশাপাশি যুক্ত করতে চাইতে পারেন।
এসভি 1

45

রেলগুলি কীভাবে জানতে পারে যে user_idএটি একটি বিদেশী কী রেফারেন্সিং user?

রেলগুলি নিজেই জানে না যে user_idএটি কোনও বিদেশী কী রেফারেন্সিং user। প্রথম কমান্ডে rails generate model Micropost user_id:integerএটি কেবল একটি কলাম যুক্ত করে user_idতবে রেলগুলি কর্নার ব্যবহার জানে না। আপনাকে ম্যানুয়ালি Micropostমডেলটিতে লাইনটি লাগাতে হবে

class Micropost < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :microposts
end

কীওয়ার্ড belongs_toএবং has_manyএই মডেল এবং ঘোষণা মধ্যে সম্পর্ক নির্ধারণ user_idকরার জন্য একটি বিদেশী কী-এর মত Userমডেল।

পরে কমান্ড rails generate model Micropost user:referencesলাইন যোগ করে belongs_to :userMicropostমডেল এবং এতদ্দ্বারা একটি বিদেশী কী-এর মত ঘোষণা করে।

এফওয়াইআই
প্রাক্তন পদ্ধতিটি ব্যবহার করে বিদেশী কীগুলি ঘোষণার মাধ্যমে কেবলমাত্র মডেলগুলি / টেবিলের সম্পর্ক সম্পর্কে রেলগুলি জানতে দেয়। ডাটাবেস সম্পর্ক সম্পর্কে অজানা। অতএব আপনি যখন সফ্টওয়্যার ব্যবহার করে EER ডায়াগ্রাম তৈরি করেন তখন আপনি MySql Workbenchদেখতে পাবেন যে মডেলগুলির মধ্যে কোনও সম্পর্কের থ্রেড নেই। নিম্নলিখিত ছবিতে লাইক এখানে চিত্র বর্ণনা লিখুন

তবে আপনি যদি পরবর্তী পদ্ধতিটি ব্যবহার করেন তবে আপনি দেখতে পাবেন যে আপনার মাইগ্রেশন ফাইলটি এমন দেখাচ্ছে:

def change
    create_table :microposts do |t|
      t.references :user, index: true

      t.timestamps null: false
    end
    add_foreign_key :microposts, :users

এখন বিদেশী কীটি ডাটাবেস স্তরে সেট করা আছে। এবং আপনি সঠিক EERচিত্রটি তৈরি করতে পারেন । এখানে চিত্র বর্ণনা লিখুন


1
মনে হচ্ছে যে সর্বশেষ পাগল জেনারেটরের প্রতিস্থাপিত add_foreign_keyএকটি বিকল্প কর্ম foreign_key: trueকরতে t.referencesলাইন, যা বোঝা index: true। তাই এখন t.references :user, foreign_key: trueforeign_keyউপলব্ধ বিকল্পের জন্য বর্তমানে কোনও ডকুমেন্টেশন নেই , সুতরাং এটি কেবল আমার অনুমান।
ফ্রাঙ্কলিন ইউ

ওহ, add_referenceক্রিয়াটির একটি :foreign_keyবিকল্প রয়েছে যা উপযুক্ত বিদেশী কী বাধা যুক্ত করে । আমার ধারণা টেবিল তৈরি করার সময় এই বিকল্পটি একই কাজ করবে।
ফ্রাঙ্কলিন ইউ

আপনি কীভাবে আপনার রুবি ডিবিটি ওয়ার্কবেঞ্চে রফতানি করবেন? : আপনি হয়তো এই এখানে উত্তর দিতে পারে stackoverflow.com/questions/42982921/...
Krawalla

রেলগুলির add_foreign_key :microposts, :users জন্য কোনও পার্থক্য রয়েছে কি ?
লিনাস

17

পূর্বের জন্য, কনফিগারেশন ওভার কনভেনশন। আপনি যখন অন্য টেবিলটির সাথে রেফারেন্স করেন তখন ডিফল্ট রেলগুলি

 belongs_to :something

সন্ধান করা হয় something_id

references, বা belongs_toআসলে কয়েক কীর্তি দিয়ে প্রাক্তন রচনার নতুন পদ্ধতি।

গুরুত্বপূর্ণ এটি মনে রাখবেন যে এটি আপনার জন্য বিদেশী কী তৈরি করবে না। এটি করার জন্য, আপনাকে অবশ্যই এটি ব্যবহার করে সুস্পষ্টভাবে সেট আপ করতে হবে:

t.references :something, foreign_key: true
t.belongs_to :something_else, foreign_key: true

বা (বহুবচন দ্রষ্টব্য):

add_foreign_key :table_name, :somethings
add_foreign_key :table_name, :something_elses`

1
রেফারেন্সগুলি আপনার জন্য বিদেশী কী তৈরি করবে না বলে আপনি কী বোঝাতে চেয়েছেন তা কি আপনি ব্যাখ্যা করতে পারেন? ইউজার_আইডি: ইন্টিজার সরাসরি ব্যবহার করে এটি প্রথম কমান্ড থেকে কীভাবে আলাদা?
শায়লেশ

এটি :polymorphicবিকল্প নয় তবে আপনি বিকল্পটি ব্যবহার করছেন (যা আইএমএইচও, বেশিরভাগ ক্ষেত্রে, এটি ভাল ধারণা নয়)। আপনি ActiveRecord বিদেশী কী ব্যবহার করতে চান, ব্যবহার বিদেশী
ক্রুলে

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