Допустим, у нас есть два таких класса:
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 есть похожие сообщения, и я пытался их прочитать и понять. Никто из них толком не помог.
Categiorization
?source: categorizable
заставляет меня думать, что вы используете STI в этой таблице, хотя в вашем посте об этом не упоминается. - person Lanny Bose   schedule 29.10.2015