0

考虑以下示例代码:

def Product < ActiveRecord::Base
end

def Book < Product
end

(我放弃了为这种关系寻找名称。我认为 Book 是“子模型”,而 Product 是“父模型”,但这是不正确的。例如,链接到另一个 Comment 模型对象的 Comment 模型对象是什么将是“子父”关系。如果您有更好的方式来描述我上面代码中模型之间的关系,欢迎您在这里写下来。无论如何,这并不是我在这里的真正原因.)

当然,使用上面的代码,Book 模型将与 Product 共享同一个数据库表,“products”。模型类型将作为字符串保存在表的“类型”列中。因此,调用 Product.create 将在表中插入一个类型值设置为“Product”的行,并且与 Book.create 一起使用将执行相同的操作,但值为“Book”。

然而,令我困惑的是,调用 Book.last 将返回类型为“Book”的最后一行,正如我所期望的那样,但 Product.last 将返回最后一行,无论是什么类型,包括“Product”和“Book, ” 尽管我希望只获得最后一个“产品”。

我尝试在 Product 中定义一个 default_scope,我在 Book 中覆盖它,但这会导致比它解决的问题更多的问题,并且弄乱了我在 Product 中由 Book 继承的命名范围。

有没有办法让 Product.last 返回“Product”类型的最后一个对象并避免任何“Book”类型的对象?

提前感谢您的回答。

4

2 回答 2

0

这里的基本误解似乎是在“关系”或“关联”的概念(如“has_one”、“belongs_to”等)与面向对象的继承概念之间。

阅读此内容: http ://rubylearning.com/satishtalim/ruby_inheritance.html

根据您的示例,我认为您已经弄清楚了关联的概念,但是您将其与继承混淆了,这是不一样的,并且您在这里不太了解。

当一个类继承自另一个类(在您的示例中,Book 继承自 Product)时,“子”类将获得“父”类的所有功能,以及它添加的任何新功能。

因此,所有书籍都是产品,但并非所有产品都是书籍

Product.last 无论类型如何都返回 products 表中的最后一行的原因是因为所有产品(包括书籍)都是产品。所以,一本书是一个产品,因此如果最后一个产品是一本书,那将被退回。


好的,所以完成您在这里尝试做的最简单的方法是将所有类型的产品定义为产品的子类型,并且永远不要使用 Product.last。

假设您正在跟踪书籍、CD 和汽车

图书类 < 产品类 CD < 产品类 汽车 < 产品

这样,当您需要将最新的 Book、CD 或 Car 添加到数据库中时,您可以执行 Book.last、CD.last 或 Car.last。如果您只需要了解任何类型的最新产品,您可以使用 Product.last。

于 2011-06-29T03:03:05.017 回答
0

在我看来很清楚 Product.last 应该返回最后一行,因为表中的所有内容都是“产品”。您想要做的是搜索特定类型“产品”,但事实证明该表实际上并未为产品设置类型,它只是将其保留为零。

所以这实际上有效,我认为:

Product.find_last_by_type(nil)

你能试试吗?我在另一张桌子上进行了测试,但我认为这应该可行。

于 2011-06-29T02:07:06.407 回答