类别和其他模型之间的多对多

Many to many between categories and other models

假设我们有两个 类 像这样:

class Book < ActiveRecord::Base
end

class Magazine < ActiveRecord::Base
end

这些实体可以有很多类别,每个类别可以有很多书或很多杂志,但不能同时本书和杂志。

处理此问题的一种方法是创建两个单独的类别模型,即 BookCategoryMagazineCategory,然后创建多对多关系。

我想知道是否有办法仅通过一个 Category 模型来做到这一点。

我考虑过多态性,但它并不适用于多对多。

我尝试了如下的 STI,但无法破解它:

class Book < ActiveRecord::Base
  has_many :categorizations
  has_many :book_categories, through: :categorizations
end

class Category < ActiveRecord::Base
end

class BookCategory < Category
  has_many :categorizations
  has_many :books, through: :categorizations, source: :categorizable, source_type: "Book"
end

但这会产生以下 SQL,这是不正确的:

SELECT "books".* FROM "books" INNER JOIN "categorizations"
ON "books"."id" = "categorizations"."categorizable_id"
WHERE "categorizations"."book_category_id" = ?
AND "categorizations"."categorizable_type" = ?  [[nil, 1], ["categorizable_type", "Book"]]

我应该放弃并使用两个单独的类别表来执行此操作,还是有办法使用 STI 或多态性来执行此操作?即使有办法,使用它是否合乎逻辑?

P.S。我知道 SO 上有类似的帖子,我试着阅读和理解它们。 None 其中确实有帮助。

class Book < ActiveRecord::Base
  has_and_belongs_to_many :book_categories, join_table: :books_categories
end

class Category < ActiveRecord::Base
end

class BookCategory < Category
  has_and_belongs_to_many: books, join_table: :books_categories
end

根据has_and_belongs_to_many association设置table