Как реализовать многие-ко-многим в моделях Active Record в Rails? - PullRequest
0 голосов
/ 05 ноября 2018

Я делаю проект Rails для школы, и одно из требований заключается в том, что я использую отношения многие ко многим в своих моделях. Примеры, на которые я смотрю, очень просты и имеют смысл, но я просто не могу включить это в то, что я конкретно делаю.

Проект, которым я занимаюсь, - это сайт спортивных ставок, в основном вы выбираете либо Fighter A, либо Fighter B, чтобы выиграть, а шансы будут отображаться на странице с указанием потенциальной суммы выплаты и т. Д.

Я создал модель A Fighter , Fight и Event , и заставить их хорошо работать друг с другом было непросто. Вот что у меня есть:

class Event < ApplicationRecord
  has_many :fights
end

class Fight < ApplicationRecord
  belongs_to :red_corner, :class_name => "Fighter", :foreign_key => 'red_id'
  belongs_to :blue_corner, :class_name => "Fighter", :foreign_key = 'blue_id'
  belongs_to :event
end

class Fighter < ApplicationRecord
  has_one :red_corner, :class_name => "Fighter", :foreign_key => 'red_id'
  has_one :blue_corner, :class_name => "Fighter", :foreign_key => 'blue_id'
end

Просто для того, чтобы рассказать об этом в случае, если кто-то запутался, событие проводит много боев за ночь, скажем, около 10. Бой состоит из 2 бойцов (противник в красном углу и один в синем углу, не уверен если я обработал FK там должным образом, но я верю, что это работает до сих пор).

Что мне нужно, это:

  1. Здесь ситуация со многими ко многим, которую я могу включить. Было бы неплохо как-то включить мою модель событий в нее, чтобы я мог вернуть список боев, которые находятся на определенном событии. (Вместо загрузки нескольких значений в один столбец в моей таблице событий).
  2. Я также хотел использовать таблицу Fights для получения имен бойцов, но без сохранения их в модели Fight (имя бойца находится внутри модели Fighter). Пример: 'Fight.find (2) .ighters.names' - что-то на этот счет в любом случае.

Можно также опубликовать мою схему, если потребуется.

1 Ответ

0 голосов
/ 06 ноября 2018

Вы не упомянули, что хотели получить бой для данного бойца, поэтому с этим допущением вы можете просто избавиться от всего, что есть в вашей модели бойца, и оно должно работать (при условии, что ваша схема действительна). (Если вы ДЕЙСТВИТЕЛЬНО хотели получить все бои за бойца, это было бы немного сложнее ... Я могу помочь, если вам это действительно нужно):

Делаем это:

class Event < ApplicationRecord
  has_many :fights
end

class Fight < ApplicationRecord
  belongs_to :event
  belongs_to :red_corner, :class_name => "Fighter", :foreign_key => 'red_id'
  belongs_to :blue_corner, :class_name => "Fighter", :foreign_key => 'blue_id'
end

class Fighter < ApplicationRecord

end

Позволяет мне сделать:

fighter1 = Fighter.create(name: "Bob")
=> #<Fighter id: 1, name: "Bob", created_at: "2018-11-06 00:52:05", updated_at: "2018-11-06 00:52:05">

fighter2 = Fighter.create(name: "Jack")
=> #<Fighter id: 2, name: "Jack", created_at: "2018-11-06 00:52:06", updated_at: "2018-11-06 00:52:06">

event = Event.create(name: "Super fight day")
=> #<Event id: 1, name: "Super fight day", created_at: "2018-11-06 00:52:09", updated_at: "2018-11-06 00:52:09">

fight = event.fights.create(red_corner: fighter1, blue_corner: fighter2)
=> #<Fight id: 1, event_id: 1, red_id: 1, blue_id: 2, created_at: "2018-11-06 00:52:09", updated_at: "2018-11-06 

puts "#{Event.first.fights.first.red_corner.name} vs #{Event.first.fights.first.blue_corner.name}"
Bob vs Jack
...