首页 > 解决方案 > 为什么多对多关系的关联模型只有一半多元化?

问题描述

我有一个 modelUser和一个 model Group,在两者之间我想用一个连接表创建一个多对多关联,使用through.

用户.rb:

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

组.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

我最初尝试做同样的事情来命名加入模型类GroupsUsersgroups_users.rb但我得到一个未初始化的常量错误,除非我曾经:class_name指定类名。

我的问题是:复数第一个名字而不是第二个名字的逻辑是什么?该关联是多对多的,因此两个模型处于平等地位。在这种情况下,组排在第一位仅仅是因为词汇顺序。那么为什么要复数一个而不是另一个呢?这对我来说毫无意义。

标签: ruby-on-rails

解决方案


更传统的命名方法是:

#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

例如,如果您查看Active Record 关联指南的The has_many :through Association部分,您会看到连接模型 ( ) 是单数的。这是您要遵循的模式。Appointment

如果你决定做一些非常规的事情,那么 rails 需要你帮助它——例如要求你指定class_name.


推荐阅读