我们说我们有两个类似的那样:
class Book < ActiveRecord::Base
end
class Magazine < ActiveRecord::Base
end
这些实体可以有多个类别,每个类别可以有很多书或许多杂志,但不是书籍和杂志。
解决此问题的一种方法是创建两个单独的类别模型,即BookCategory
和MagazineCategory
,然后创建多对多关系。
我想知道是否有办法通过一个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上有类似的帖子,我尝试阅读和理解它们。他们都没有真正帮助过。
答案 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
设置表格