কারাগারে একটি "has_many: মাধ্যমে" সম্পর্ক ব্যবহার করবেন?


123

আমি has_many :throughএটি কী এবং কখন এটি ব্যবহার করব (এবং কীভাবে) তা বোঝার চেষ্টা করছি । তবে আমি তা পাচ্ছি না। আমি বিগনিং রেল 3 পড়ছি এবং আমি গুগলিংয়ের চেষ্টা করেছি, তবে আমি বুঝতে পারছি না।

উত্তর:


177

বলুন আপনার কাছে দুটি মডেল রয়েছে: Userএবং Group

আপনি যদি ব্যবহারকারীদের গোষ্ঠীভুক্ত থাকতে চান তবে আপনি এরকম কিছু করতে পারেন:

class Group < ActiveRecord::Base
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :group
end

আপনি যদি সমিতির চারপাশে অতিরিক্ত মেটাডেটা ট্র্যাক করতে চান? উদাহরণস্বরূপ, যখন ব্যবহারকারী দলে যোগ দিলেন, বা সম্ভবত এই গ্রুপে ব্যবহারকারীর ভূমিকা কী?

এখানেই আপনি সমিতিটিকে প্রথম শ্রেণির বস্তু হিসাবে পরিণত করেছেন:

class GroupMembership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group

  # has attributes for date_joined and role
end

এটি একটি নতুন সারণি প্রবর্তন করে এবং group_idব্যবহারকারীর টেবিল থেকে কলামটি সরিয়ে দেয়।

এই কোডটির সাথে সমস্যাটি হ'ল আপনি অন্য কোথাও ব্যবহারকারীর শ্রেণিটি ব্যবহার করে এটি পরিবর্তন করতে হবে এবং এটি পরিবর্তন করতে হবে:

user.groups.first.name

# becomes

user.group_memberships.first.group.name

এই ধরণের কোডটি সফল হয় এবং এটি বেদনাদায়ক এর মতো পরিবর্তনগুলি করে।

has_many :through আপনাকে উভয় বিশ্বের সেরা দেয়:

class User < ActiveRecord::Base
  has_many :groups, :through => :group_memberships  # Edit :needs to be plural same as the has_many relationship   
  has_many :group_memberships
end

এখন আপনি এটি একটি সাধারণের মতো চিকিত্সা করতে পারেন has_many, তবে আপনার প্রয়োজনের সাথে অ্যাসোসিয়েশন মডেলের সুবিধা পান।

নোট করুন যে আপনি এটি দিয়ে এটি করতে পারেন has_one

সম্পাদনা করুন: একটি গ্রুপে ব্যবহারকারী যুক্ত করা সহজ করা

def add_group(group, role = "member")
  self.group_associations.build(:group => group, :role => role)
end

2
আমি userএখানে গ্রুপ যুক্ত করার জন্য মডেলটিতে একটি পদ্ধতি যুক্ত করব। আমি সবেমাত্র সম্পাদনার মতো কিছু। আশাকরি এটা সাহায্য করবে.
বেন স্কিমারান

দেখছি, আমাকেও কি লিখতে হবে user.groups << group? বা সবকিছু এই সমিতি দ্বারা পরিচালিত হয়?
লাকীলুক

আমার একটি ক্লাস রয়েছে যা গ্রুপ_সাম্বারশিপের সাথে সমান এবং আমি ফ্যাক্টরির মেয়েটিকে ব্যবহার করতে সমস্যা হচ্ছি তাতে কি আপনি আমাকে সহায়তা করবেন?
আয়মান সালাহ

আমি "has_many: গ্রুপ_মেম্বারশিপ" ব্যবহার করব। একক ব্যবহার করে কাজ হবে তবে ইউজারআরগ্রুপ_মেম্বারশিপ সংগ্রহ এবং ইউজারগ্রুপ_মেম্বারশিপগুলি কাজ করবে না।
calasyr

এটি একটি টাইপ ছিল। সংশোধন করা হয়েছে।
বেন স্কিমারান

212

বলুন আপনার কাছে এই মডেলগুলি রয়েছে:

Car
Engine
Piston

একটি গাড়ি has_one :engine
একটি ইঞ্জিন belongs_to :car
একটি ইঞ্জিন has_many :pistons
পিস্তনbelongs_to :engine

একটি গাড়ি has_many :pistons, through: :engine
পিস্টনhas_one :car, through: :engine

মূলত আপনি একটি মডেল সম্পর্ককে অন্য মডেলকে অর্পণ করছেন, সুতরাং কল করার পরিবর্তে car.engine.pistonsআপনি কেবল এটি করতে পারেনcar.pistons


9
এটি পুরো অর্থে তৈরি হয়!
রাজজি

24
আমি এই এসএসিএ - শর্টএন্ডক্লায়ারঅ্যানসওয়ার বলি।
অসম মাত্র

18

অ্যাক্টিভেকর্ড টেবিলগুলিতে যোগদান করুন

has_many :throughএবং has_and_belongs_to_manyসম্পর্কগুলি একটি যোগদান টেবিলের মাধ্যমে কাজ করে যা একটি মধ্যবর্তী টেবিল যা অন্যান্য টেবিলের মধ্যে সম্পর্কের প্রতিনিধিত্ব করে। একটি JOIN ক্যোয়ারির বিপরীতে, ডেটা আসলে একটি টেবিলের মধ্যে সংরক্ষণ করা হয়।

ব্যবহারিক পার্থক্য

এর সাথে has_and_belongs_to_manyআপনার প্রাথমিক কী দরকার নেই এবং অ্যাক্টিভেকর্ড মডেলের পরিবর্তে অ্যাক্টিভেকর্ড সম্পর্কের মাধ্যমে আপনি রেকর্ডগুলি অ্যাক্সেস করতে পারেন। আপনি যখন অনেকগুলি থেকে বহু সম্পর্কের সাথে দুটি মডেলকে সংযুক্ত করতে চান আপনি সাধারণত HABTM ব্যবহার করেন।

আপনি একটি has_many :throughসম্পর্ক ব্যবহার করবেন যখন আপনি রেল মডেল হিসাবে যোগদানের টেবিলের সাথে যোগাযোগ করতে চান, প্রাথমিক কীগুলির সাথে সম্পূর্ণ এবং যুক্ত হওয়া ডেটাতে কাস্টম কলামগুলি যুক্ত করার ক্ষমতা দিয়ে থাকে। সংযুক্ত সারিগুলির সাথে প্রাসঙ্গিক ডেটাগুলির জন্য পরবর্তীটি বিশেষত গুরুত্বপূর্ণ, তবে সত্যিই সম্পর্কিত মডেলগুলির সাথে সম্পর্কিত নয় - উদাহরণস্বরূপ, যুক্ত সারিতে ক্ষেত্রগুলি থেকে প্রাপ্ত গণনাকৃত মান সংরক্ষণ করে।

আরো দেখুন

ইন সক্রিয় রেকর্ড সমিতি এ গাইড টু , সুপারিশ লেখা আছে:

থাম্বের সহজতম নিয়মটি হ'ল_আপনি একটি হ্যাসম্যানি সেটআপ করা উচিত: সম্পর্কের মাধ্যমে যদি আপনাকে স্বাধীন সত্তা হিসাবে সম্পর্কের মডেলটির সাথে কাজ করতে হয়। যদি আপনার সম্পর্কের মডেলটির সাথে কিছু করার দরকার না হয় তবে একটি has_and_belongs_to_many সম্পর্ক স্থাপন করা সহজ হতে পারে (যদিও আপনাকে ডাটাবেসে যোগদানের সারণীটি তৈরির জন্য মনে রাখা দরকার)।

আপনার has_many ব্যবহার করা উচিত: যদি আপনার যোগদানের মডেলটিতে বৈধতা, কলব্যাকস বা অতিরিক্ত গুণাবলী প্রয়োজন হয় through

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