类别和其他模型之间的多对多
Many to many between categories and other models
假设我们有两个 类 像这样:
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 上有类似的帖子,我试着阅读和理解它们。 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
假设我们有两个 类 像这样:
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 上有类似的帖子,我试着阅读和理解它们。 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