类别和其他模型之间有很多对很多

时间:2015-10-28 21:35:45

标签: ruby-on-rails polymorphic-associations single-table-inheritance

我们说我们有两个类似的那样:

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上有类似的帖子,我尝试阅读和理解它们。他们都没有真正帮助过。

1 个答案:

答案 0 :(得分:2)

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

设置表格