has_many: من خلال الأسئلة
-
19-09-2019 - |
سؤال
كنت في السابق باستخدام has_and_belongs_to_many، وتحويلها إلى has_many: من خلال. إليك كيفية البحث عن قائمة الألعاب التي يمكن أن يلعب العديد من المستخدمين. مع هذا، يمكنني القيام به game.users and user.games.games ....:
class Game < ActiveRecord::Base
has_many :game_users, :dependent => :destroy
has_many :users, :through => :game_users, :uniq => true
end
class User < ActiveRecord::Base
has_many :game_users, :dependent => :destroy
has_many :games, :through => :game_users, :uniq => true
end
class GameUser < ActiveRecord::Base
belongs_to :game
belongs_to :user
end
وترحيل قاعدة البيانات الخاصة بي لجدول الانضمام:
create_table :game_users, :id => false do |t|
t.column :game_id, :integer
t.column :user_id, :integer
t.column :player_index, :integer
end
لست متأكدا تماما أحصل على كل هذا، فالرجاء مساعدتي في التحقق من حقائقي:
هو المعال =>: تدمير صحيح؟ أريد حذف إدخال جدول "Game_Users" في حالة حذفه إذا تم تدمير اللعبة أو المستخدم - لكنني لا أريد حذف المستخدمين إذا تم حذف الألعاب والعكس صحيح .....؟
من المفترض أن يقول مجال UNIQUQ أن الألعاب تحتوي على مستخدمين فريدين فقط، ويحتوي المستخدمون فقط على ألعاب فريدة فقط. هل هذا صحيح؟
ترحيل قاعدة البيانات كما كان من قبل: معرف => خطأ. هل هذا لا يزال الشيء الصحيح الذي يجب القيام به؟ حاولت في وحدة التحكم في تدمير لعبة، وحصلت على شكاوى حول الهوية المفقودة ... لذلك أنا أظن أن أظن ولا أحاول فهم السبب.
أجد قضبان رقائق سجل نشطة مربكة للغاية. أعتقد أنهم ليسوا من المفترض أن يكونوا!
المحلول
1: نعم، هذا صحيح
2: من وثائق حول UNIQ.:
إذا كان هذا صحيحا، سيتم حذف التكرارات من المجموعة. مفيد بالتزامن مع: من خلال.
لذلك، نعم، إذا كنت تهدف لا تحصل على نفس اللعبة في مجموعة ألعاب المستخدم ولا المستخدم نفسه في مجموعة مستخدمي اللعبة، فهذا صحيح. كل شيء موضح هنا.
ومع ذلك، لن تمنع إنشاء لعبة مكررة. لذلك، كنت بحاجة إلى استخدام التحقق من صحة_ التفرد _of. في نموذج GameUser:
class GameUser < ActiveRecord::Base
validates_uniqueness_of :game_id, :scope => :user_id
end
3: لا، لا تريد استخدام: ID => False الآن. عن طريق التبديل من has_and_belongs_to_many إلى has_many: من خلال، قمت بترقية لديك العديد من اجتماعات الانضمام إلى طراز كامل - GameUser - والتي تتطلب معرفها الخاص.
في حين أنه قديم، هذه لا يزال مقال جيد لفهم has_many: من خلال.