咨询Rails中has_and_belongs_to_many的表名及关联名单复数规范
Ruby on Rails has_and_belongs_to_many 关联常见疑问解答
一、连接表名的单复数规则
- Rails 里
has_and_belongs_to_many(常简称 HABTM)的连接表,必须用两个关联模型的复数形式,按字母顺序拼接、下划线分隔。 - 举个实际例子:如果是
User和Group做 HABTM 关联,连接表就得叫groups_users(因为字母 g 排在 u 前面);要是User和Contact,那就是contacts_users。 - 额外提醒:连接表不需要加主键
id,Rails 默认会用两个模型的外键(比如user_id和contact_id)来关联数据。 - 要是你想自定义连接表名(比如你示例里的
blocked_contacts),只要表结构里包含两个关联模型的外键就行,自定义名称不用严格套默认的字母顺序复数规则,但最好保证语义清晰。
二、HABTM 关联名称的单复数选择
has_and_belongs_to_many的关联名称必须用复数形式,因为这个关联本来就表示当前模型能关联多个目标模型实例,逻辑和has_many一致。- 你给出的代码
has_and_belongs_to_many :user, join_table: :blocked_contacts是错的,正确写法应该是:has_and_belongs_to_many :users, join_table: :blocked_contacts - 这么定义后,你就能用
model.users这种方式获取所有关联的用户实例,完全符合 Rails 约定式编程的风格。
内容的提问来源于stack exchange,提问作者Mooventhan
相关产品推荐
相关产品推荐

