Рельсы от многих до многих отношений

msmith1114 спросил: 12 мая 2018 в 05:15 в: ruby-on-rails

Итак, я работаю над приложением rails для пользователей, чтобы создавать события (и посещать другие созданные события). Вы можете прочитать о задании здесь (для проекта Odin): https://www.theodinproject.com/courses/ruby-on-rails/lessons/associations

В любом случае, я думал, что понял много многие отношения в рельсах, но то, как я видел, что другие люди пишут модели, сбивает меня с толку.

Мне кажется, что это должно быть что-то вроде:

class User < ApplicationRecord
  has_many :attendances
  has_many :events, through: :attendances
endclass Attendance < ApplicationRecord
  belongs_to :user
  belongs_to :event
endclass Event < ApplicationRecord
  has_many :users
  has_many :users, through: :attendances
end

Это имеет смысл для меня, потому что Пользователь может создавать множество событий, и на мероприятии может присутствовать много пользователей. (Хотя посещаемость, вероятно, является неправильным словом, может быть, приглашением или чем-то еще).

Но я видел некоторые странные примеры (вы можете увидеть другие исходные тексты ниже в проекте), и кажется, что они добавляют много больше к моделям, а также переименовать имя источника / foreign_key / class_name.

Я что-то упустил? Это все еще позволяет пользователю "владеть" событием? Возможно, я неправильно понимаю, как много-ко-многим работает. Но это, по крайней мере, имеет в виду, как это должно быть.

Для справки некоторые другие модели, которые я видел, были похожи на это:

class Event < ActiveRecord::Base
    belongs_to :creator, :class_name => "User"
    has_many :event_attendees, :foreign_key => :attended_event_id
    has_many :attendees, :through => :event_attendees
endclass EventAttendee < ActiveRecord::Base
    belongs_to :attendee, :class_name => "User"
    belongs_to :attended_event, :class_name => "Event"
endclass User < ActiveRecord::Base
    has_many :created_events, :foreign_key => :creator_id, :class_name => "Event"
    has_many :event_attendees, :foreign_key => :attendee_id
    has_many :attended_events, :through => :event_attendees, :foreign_key => :attendee_id'
end

вещи к вышесказанному. Я не совсем уверен, что это делает? Или зачем все это необходимо.


2 ответа

Есть решение
Alexander Sysuiev ответил: 12 мая 2018 в 06:38

В вашем примере все согласно соглашениям. Возможно, за исключением таблиц многозначных таблиц. attendances имеет поля user_id и event_id. Но в случае, если он может конфликтовать с другими полями или недостаточно описателен, вы можете использовать разные ключи.

belongs_to :creator, :class_name => "User"

belongs_to :creator по умолчанию будет искать Creator, поэтому необходимо явно указывать имя класса, как в приведенном примере.

has_many :event_attendees, :foreign_key => :attended_event_id

По умолчанию внешний ключ будет event_id, поэтому здесь также явно указано.

has_many :created_events, :foreign_key => :creator_id, :class_name => "Event"

По умолчанию рельсы будут искать внешний код user_id и CreatedEvent. И эти атрибуты указаны явно.

Вам просто нужно понять, какие атрибуты по умолчанию предоставляются по умолчанию, чтобы изменить, если это необходимо.

msmith1114 ответил: 12 мая 2018 в 07:17
Это имеет смысл. Итак, то, что у меня сейчас, определяется аналогично выше, но при создании invite и выполнении чего-то вроде user.attended_events он дает ActiveRecord::HasManyThroughOrderError: Cannot have a has_many :through association 'User#attended_events' which goes through 'User#invites' before the through association is defined.. Значит, мне что-то не хватает?
Alexander Sysuiev ответил: 12 мая 2018 в 03:47
В вашем коде нет attended_events. Вы должны сделать user.events, если ваша структура db верна
Marlin Pierce ответил: 12 мая 2018 в 06:38

Ассоциации ActiveRecord по умолчанию используют класс и внешний ключ с тем же именем, что и ассоциация. Код здесь конкретно указывает их, потому что они не являются стандартными.