سؤال

كنت في السابق باستخدام 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

لست متأكدا تماما أحصل على كل هذا، فالرجاء مساعدتي في التحقق من حقائقي:

  1. هو المعال =>: تدمير صحيح؟ أريد حذف إدخال جدول "Game_Users" في حالة حذفه إذا تم تدمير اللعبة أو المستخدم - لكنني لا أريد حذف المستخدمين إذا تم حذف الألعاب والعكس صحيح .....؟

  2. من المفترض أن يقول مجال UNIQUQ أن الألعاب تحتوي على مستخدمين فريدين فقط، ويحتوي المستخدمون فقط على ألعاب فريدة فقط. هل هذا صحيح؟

  3. ترحيل قاعدة البيانات كما كان من قبل: معرف => خطأ. هل هذا لا يزال الشيء الصحيح الذي يجب القيام به؟ حاولت في وحدة التحكم في تدمير لعبة، وحصلت على شكاوى حول الهوية المفقودة ... لذلك أنا أظن أن أظن ولا أحاول فهم السبب.

أجد قضبان رقائق سجل نشطة مربكة للغاية. أعتقد أنهم ليسوا من المفترض أن يكونوا!

هل كانت مفيدة؟

المحلول

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: من خلال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top