বোধগম্য: কারাগারের মাধ্যমে has_one / has_many এর উত্স বিকল্প


184

সংযোগের :sourceবিকল্পটি বুঝতে আমাকে সহায়তা করুন understanding has_one/has_many :throughরেলস এপিআই ব্যাখ্যাটি আমার কাছে খুব কম বোঝায়।

"নির্দিষ্ট করে উৎস সমিতি নামে ব্যবহৃত has_many :through => :queriesদেয়। শুধুমাত্র এটি ব্যবহার নাম সমিতি থেকে অনুমিত করা যাবে না পারেন। has_many :subscribers, :through => :subscriptionsপারেন জন্য চেহারা হবে :subscribersবা :subscriberউপর Subscription, যদি না :sourceদেওয়া হয়।"

উত্তর:


237

কখনও কখনও, আপনি বিভিন্ন সংঘের জন্য বিভিন্ন নাম ব্যবহার করতে চান। আপনি যদি মডেলটির কোনও সংস্থার জন্য যে নামটি ব্যবহার করতে চান তা যদি মডেলটির সহযোগিতার মতো না হয় তবে :throughআপনি :sourceএটি নির্দিষ্ট করতে ব্যবহার করতে পারেন ।

আমি মনে করি না উপরের অনুচ্ছেদটি ডক্সের তুলনায় আরও পরিষ্কার, সুতরাং এখানে একটি উদাহরণ দেওয়া আছে। ধরা যাক আমাদের তিনটি মডেল রয়েছে Pet, Dogএবং Dog::Breed

class Pet < ActiveRecord::Base
  has_many :dogs
end

class Dog < ActiveRecord::Base
  belongs_to :pet
  has_many :breeds
end

class Dog::Breed < ActiveRecord::Base
  belongs_to :dog
end

এই ক্ষেত্রে, আমরা নামটির স্থানটি বেছে নিয়েছি Dog::Breed, কারণ আমরা Dog.find(123).breedsএকটি সুন্দর এবং সুবিধাজনক সমিতি হিসাবে অ্যাক্সেস করতে চাই ।

এখন, এখন যদি আমরা একটি has_many :dog_breeds, :through => :dogsসমিতি তৈরি করতে চাই Pet, হঠাৎ আমাদের একটি সমস্যা হয়। পাগল একটা খুঁজে পেতে সক্ষম হবেন না :dog_breedsউপর সমিতি Dog, তাই পাগল সম্ভবত জানতে পারে না যা Dog সমিতি আপনি ব্যবহার করতে চান। প্রবেশ করান:source :

class Pet < ActiveRecord::Base
  has_many :dogs
  has_many :dog_breeds, :through => :dogs, :source => :breeds
end

সঙ্গে :sourceকরছি বলার পাগল, একটি অ্যাসোসিয়েশন নামক জন্য চেহারা :breedsউপর Dogমডেল (যেমন যে জন্য ব্যবহৃত মডেল :dogs, এবং যে ব্যবহার)।


2
আমি মনে করি আপনি আপনার শেষ শ্রেণির প্রাণীটিকে ক্লাস পোষা প্রাণী বলে অভিহিত করেছেন, আমি বিশ্বাস করি কেবল একটি টাইপো।
কামিলস্কি 81

3
উপরের উদাহরণে, সমিতি অধীনে উচিত Dogহবে has_many :breedপরিবর্তে :breedsএবং তারপর :sourceকরা :breedএকবচন, মডেল নাম প্রতিনিধিত্ব করার পরিবর্তে :breedsসারণী নাম প্রতিনিধিত্ব করে কোনটি? যেমন has_many :dog_breeds, :through => :dogs, :source => :breed(কোন sপ্রত্যয় নেই :breed)?
LazerSharks

1
আমি এটি পরীক্ষা করেছি। এটি একবচন, sপ্রত্যয়টি নেই:source =>
আনোয়ার

"এই ক্ষেত্রে, আমরা কুকুর :: জাতকে নামকরণ করা বেছে নিয়েছি, কারণ আমরা ডগ.ফাইন্ড (123) অ্যাক্সেস করতে চাই want আপনি কি তার জন্য কোনও স্থানের দরকার নেই?
Jwan622

200

আমাকে সেই উদাহরণটি প্রসারিত করুন:

class User
  has_many :subscriptions
  has_many :newsletters, :through => :subscriptions
end

class Newsletter
  has_many :subscriptions
  has_many :users, :through => :subscriptions
end

class Subscription
  belongs_to :newsletter
  belongs_to :user
end

এই কোডটি দিয়ে আপনি Newsletter.find(id).usersনিউজলেটারের গ্রাহকদের তালিকা পেতে কিছু করতে পারেন । তবে আপনি যদি আরও পরিষ্কার হতে চান এবং Newsletter.find(id).subscribersপরিবর্তে টাইপ করতে সক্ষম হন তবে আপনাকে অবশ্যই নিউজলেটার ক্লাসটি এতে পরিবর্তন করতে হবে:

class Newsletter
  has_many :subscriptions
  has_many :subscribers, :through => :subscriptions, :source => :user
end

আপনি usersসমিতির নাম পরিবর্তন করছেন subscribers। আপনি যদি সরবরাহ না করেন :source, তবে কারা subscriberসাবস্ক্রিপশন ক্লাসে ডাকা একটি সমিতির সন্ধান করবে । userগ্রাহকদের তালিকা তৈরি করতে আপনাকে সাবস্ক্রিপশন শ্রেণিতে অ্যাসোসিয়েশনটি ব্যবহার করতে হবে।


2
মনে রাখবেন যে, সিঙ্গুলারি মডেলের নামগুলি :source =>বহুবচন নয়, ব্যবহার করা উচিত । সুতরাং, :usersভুল, :userসঠিক
আনোয়ার

এটি সর্বোত্তম উত্তর !, আমাকে কেবল এই অংশটিই জোর দেওয়া যাক: "আপনি গ্রাহকদের সাথে ব্যবহারকারী সংস্থার নাম পরিবর্তন করছেন you
ব্রায়ান জোসেফ স্পিনোস

11

সর্বাধিক সহজ উত্তর:

মাঝখানে টেবিলে সম্পর্কের নাম।

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