Почему модель ассоциации для отношений «многие ко многим» только наполовину плюрализирована? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть модель User и модель Group, между этими двумя я хочу создать ассоциацию «многие ко многим» с таблицей соединений, используя пользователя through.

. rb:

class User < ActiveRecord::Base
    has_many :groups_user
    has_many :groups, :through => :groups_user
end

group.rb:

class Group < ActiveRecord::Base
  has_many :groups_user
  has_many :users, :through => :groups_user
end

groups_user.rb

class GroupsUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

Сначала я попытался сделать то же самое, назвав класс присоединяемой модели GroupsUsers в groups_users.rb, но я получил неинициализированную постоянную ошибку, если только не использовал :class_name для указания имени класса.

Мой вопрос: какова логика множественного числа первого имени, а не второго? Ассоциация "многие ко многим", поэтому обе модели находятся в равных условиях. В этом случае группа на первом месте просто из-за лексического порядка. Так почему же плюрализировать одно, а не другое? Это не имеет смысла для меня.

1 Ответ

1 голос
/ 01 ноября 2019

Более традиционный подход к именованию:

#user.rb:
class User < ActiveRecord::Base
    has_many :group_users
    has_many :groups, :through => :group_users
end

#group.rb:
class Group < ActiveRecord::Base
  has_many :group_users
  has_many :users, :through => :group_users
end

#group_user.rb
class GroupUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

Обычно модель имеет форму единственного числа. Так что GroupsUser, а не GroupsUsers. Но экземпляр модели соединения имеет только один Group и один User, то есть GroupUser, а не GroupsUser.

Если вы посмотрите на раздел has_many: through Association в Руководстве по ассоциациям Active Record, например, 1015 *, вы увидите, что модель соединения (Appointment) единственное число. Это тот шаблон, которому вы хотите следовать.

Если вы решите делать что-то нетрадиционно, то rails нуждается в вашей помощи - например, требуя указать class_name.

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