Рельсы много-много путаницы в отношениях - PullRequest
0 голосов
/ 05 июня 2018

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

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

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

class User < ApplicationRecord
  has_many :attendances
  has_many :events, through: :attendances
end

class Attendance < ApplicationRecord
  belongs_to :user
  belongs_to :event
end

class 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
end

class EventAttendee < ActiveRecord::Base
    belongs_to :attendee, :class_name => "User"
    belongs_to :attended_event, :class_name => "Event"
end

class 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 ]

0 голосов
/ 05 июня 2018

В вашем примере все согласно соглашениям.Может быть, кроме именования таблиц «многие ко многим».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 модели.И эти атрибуты указаны явно.

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

0 голосов
/ 05 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...