Группировка двух записей и связывание группы с помощью HABTM в ActiveRecord | Рельсы

Я работаю над проектом Rails 5.2, который хранит списки гостей и управляет ими. У меня есть модели Event и Guest, и они связаны отношениями HABTM. Это работает хорошо, но есть требование иметь возможность дополнительно хранить группу из двух гостей (например, пары), а при добавлении гостей в список гостей пара может быть выбрана и добавлена ​​вместе, при этом пользователю не нужно запоминать, кто из них отдельных гостей следует добавлять в список гостей вместе, например, при выборе гостей для добавления в список гостей пользователь должен иметь возможность выбрать «Сэм», «Эндрю», «Мэри и Джозеф».

Каков наилучший способ добиться этого в ActiveRecord?

class Event < ApplicationRecord
  has_and_belongs_to_many :guests
end
class Guest < ApplicationRecord
  has_and_belongs_to_many :events
end

Любая помощь приветствуется!

Спасибо


person slehmann36    schedule 24.07.2018    source источник
comment
Возможно, отношение has_many - through будет хорошим решением. В сквозной таблице будет 3 столбца. event_id, guest_id, couple_id (который будет guest_id)   -  person Emu    schedule 24.07.2018
comment
Предложение @Emu должно решить вашу задачу, если в вашем приложении есть модель Couple. Руководство: guides.rubyonrails.org/   -  person Jagdeep Singh    schedule 24.07.2018
comment
Я думаю, что было бы еще лучше использовать полиморфную ассоциацию в модели EventGuest, в которой вы можете назначить либо пару, либо гостя. guides.rubyonrails.org/   -  person bo-oz    schedule 24.07.2018


Ответы (1)


Вам нужны следующие модели, непроверенные, но вы получите идею.

class Event < ApplicationRecord
  has_many :event_guests
end

class Guest < ApplicationRecord
  has_many :event_guests, :as => :assignable
  has_many :guest_couples
end

class Couple < ApplicationRecord
  has_many :event_guests, :as => :assignable
  has_many :guest_couples
end

# table to relate events to either a Guest or a Couple (polymorhpic)
class EventGuest < ApplicationRecord
  belongs_to :event
  belongs_to :assignable, polymorphic: true
end

# Model to create couples (one-to-many)
class GuestCouple < ApplicationRecord
  belongs_to :guest
  belongs_to :couple
end
person bo-oz    schedule 24.07.2018