উত্তর:
বলুন আপনার কাছে দুটি মডেল রয়েছে: 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
user.groups << group
? বা সবকিছু এই সমিতি দ্বারা পরিচালিত হয়?
বলুন আপনার কাছে এই মডেলগুলি রয়েছে:
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
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
user
এখানে গ্রুপ যুক্ত করার জন্য মডেলটিতে একটি পদ্ধতি যুক্ত করব। আমি সবেমাত্র সম্পাদনার মতো কিছু। আশাকরি এটা সাহায্য করবে.