İki model arasında iki tane birleştirme tablosu oluşturmak

Öncelikle herkese iyi forumlar.

Şuradaki konuda bahsettiğim ilişkilendirme seçeneklerinden olan winner kısmını çok-a-çok olarak ilişkilendirmek için bir join table oluşturmaya çalışıyorum ve başarısız oldum. Denediklerim:

Room.rb :

class Room < ApplicationRecord
  has_and_belongs_to_many :winners, join_table: "winner_rooms", dependent: :destroy
end

User.rb:

class User < ApplicationRecord
  has_and_belongs_to_many :won_rooms, join_table:"winner_rooms", dependent: :destroy
end

Ama aynı kodları ayarlayarak denediğimde başarılı olamadım.

Migration dosyası:

class CreateJoinTableWinnerWonRooms < ActiveRecord::Migration[6.1]
  def change
    create_join_table(:winners, :won_rooms,table_name: :winner_rooms) do |t|
      t.index :winner_id
      t.index :won_room_id
    end
  end
end

Hata:

Room.first.winners << User.where(role:"player")
  Room Load (0.3ms)  SELECT "rooms".* FROM "rooms" ORDER BY "rooms"."id" ASC LIMIT ?  [["LIMIT", 1]]
/home/tuncay/.rvm/gems/ruby-3.0.1/gems/activerecord-6.1.4.6/lib/active_record/inheritance.rb:237:in `compute_type': uninitialized constant Room::Winner (NameError)

Diğer ilişkilendirme hatasız çalışıyor.

Şimdiden teşekkürler.

Hatanın doğrudan Join Tablelar ile ilişkili olduğuna emin misiniz? Zira hatada bambaşka bir şey var.

Bu arada, ben genelde bu tarz HABTM ilişkisi içerisinde değil de has_many :through ile işaret etmeyi tercih ederim. Zira bu şekilde açık bir model belirtip onun aracılığı ile açıkça göstermiş oluyorum.

2 Likes

Evet model ile birbirlerine bağlamak aklıma gelmişti ama boşuna kullanılmayan bir model oluşturmak istemedim.

Şu şekilde çözdüm:
Room.rb:

has_and_belongs_to_many :winners,join_table:"winner_rooms",class_name:"User",foreign_key:"room_id"

User.rb:

has_and_belongs_to_many :won_rooms,join_table:"winner_rooms",class_name:"Room",foreign_key:"user_id",dependent: :destroy

Migration dosyası:

class CreateJoinTableWinnerWonRooms < ActiveRecord::Migration[6.1]
  def change
    create_table :winner_rooms,id:false do |t|
      t.belongs_to :room
      t.belongs_to :user
    end
  end
end