ruby-on-rails - 为什么多对多关系的关联模型只有一半多元化?
问题描述
我有一个 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
我最初尝试做同样的事情来命名加入模型类GroupsUsers
,groups_users.rb
但我得到一个未初始化的常量错误,除非我曾经:class_name
指定类名。
我的问题是:复数第一个名字而不是第二个名字的逻辑是什么?该关联是多对多的,因此两个模型处于平等地位。在这种情况下,组排在第一位仅仅是因为词汇顺序。那么为什么要复数一个而不是另一个呢?这对我来说毫无意义。
解决方案
更传统的命名方法是:
#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
.
推荐阅读
- sql-server - 特定时间段的 TSQL 连续成员资格,简化 WHERE
- git - 用孤立分支重写 master 但保留历史记录
- android - java.util.zip.ZipException:重复条目:org/apache/log4j/Appender.class
- xamarin - 具有透明背景的 PushModalAsync Xamarin 表单
- php - 如何从字符串中删除所有字母而不是减号(-)?
- reactjs - 当反应路由器重新安装它时,反应组件不会改变状态
- java - 如何使用休眠设置 MS SQL 设置,如 ANSI_WARNINGS、ANSI NULL 等?
- swift - 单击复选标记删除行项目
- go - 如何在 GoLang 中的 CoAP 中为服务器编写服务端点 PUT 请求方法?
- cypress - 使用 cypress 运行测试时出现错误“TypeError: Cannot set property 'width' of null..”并且测试失败