少于 1 分钟阅读

多对多关联,是 Rails 中相对复杂的一种关系表。为了便于管理,往往都会创建一个 中间表,用来记录关联表之间的关系。

例如:一个作者(Author)可以写多部著作(Book),一部著作也有可能多人合作完成。 作者与著作之间的关系就是多对多的关系,在Rails 中专门可以使用 has_and_belongs_to_many 表述。用于管理的连接表通常就会用两个表的名字进行连接获得,这里在我们的示例 中的连接表就应该叫做 authors_books。那么,叫做 books_authors 可以吗?理论 上是可以的,但是在 Rails 中,按照惯例,会将两个表的名字按照字符串的大小进行 比较,小的在前,大的在后,所以应该是 authors_books

在实际项目中,如果项目很大,数据表众多,我会将与某一部分资源相关的表进行按 照某资源统一命名。例如我做的关于古籍(表叫做 ancient_books)的部分,就会 以 ancient_book 作为前缀进行命名。于是,关于古籍收藏方式(Store Style)的表 就命名为 ancient_book_store_styles。一种古籍会有多种收藏方式,一个收藏方式 当然也会用于多种古籍,这也很正常。所以需要使用多对多关系进行关联,手动创建 连接表格则应该是 ancient_book_store_styles_ancient_books。然后,在 Model 中 设定 has_and_belongs_to_many 关系,测试。结果就出现了找不到表格“ancient_book_store_styles_books”的错误,很奇怪!

后来,决定使用 Rails 的 Migration 中的 create_join_table 方法由 Rails 进行创 建连接表,代码如下

def change
  create_join_table :ancient_book, :ancient_book_store_styles
end

系统自动创建的表叫做 ancient_book_store_styles_books,而不是我们以为的 ancient_book_store_styles_ancient_books,这个由系统自动生成的表 Rails 当然会 找到了。

关于更多 create_join_table 说明参见这里