Основное недопонимание здесь, по-видимому, связано с понятием «отношения» или «ассоциации» (например, «has_one», «own_to» и т. Д.) И объектно-ориентированной концепцией наследования.
Читайте об этом: http://rubylearning.com/satishtalim/ruby_inheritance.html
Основываясь на вашем примере, я думаю, что вы поняли концепцию ассоциаций, но вы путаете ее с наследованием , что не то же самое, и вы не совсем понимаете Вот.
Когда класс наследует от другого класса (в вашем примере Book наследует от Product), «дочерний» класс получает все функциональные возможности «родительского» класса, а также любые новые функциональные возможности, которые он добавляет к этому.
Из-за этого все Книги являются Продуктами, но не все Продукты являются Книгами .
Причина, по которой Product.last возвращает последнюю строку в таблице товаров независимо от ее типа, заключается в том, что все товары (включая книги) являются товарами. Таким образом, Книга - это продукт, поэтому, если последний Продукт - это Книга, она будет возвращена.
Хорошо, поэтому самый простой способ выполнить то, что вы пытаетесь сделать здесь, это определить все типы Продуктов как подтипы Продукта и никогда не использовать Product.last.
Допустим, вы отслеживаете книги, компакт-диски и автомобили
книга класса <Продукт
Класс CD <Продукт
Класс Car <Товар </p>
Таким образом, когда вам нужно добавить в базу данных новейшую Книгу, CD или Автомобиль, вы делаете Book.last, CD.last или Car.last. Если вам просто нужно знать новейший продукт любого типа , вы должны сделать Product.last.