0

我处于需要产品及其配件在同一个对象中的情况。我得到了带有以下代码的产品:

@products = Product.all

这可以。为了在同一个对象中获取每个产品的配件,我做了以下操作:

@products.each do |product|
   @product.accessories = Product.find_by_parent_id(product.id)
end

我试过了,但是当我打电话给@products 时,我只有产品,没有配件。

在模型中,我调用了

attr_accessor :accessories
def accessories=(test)
   accessories = test
end

我没有收到任何错误,但不幸的是我也没有收到配件。这是获取配件的正确方法吗?还是有其他方法可以实现这一目标?如果我以正确的方式做事,那我做错了什么?

提前致谢。

4

2 回答 2

2

我认为您需要更多地依赖数据库,因为 Rails 就是为此而生的,并为它提供了许多开箱即用的方法,这些方法可以避免重新发明。

由于您的每个产品都引用了其他产品,这就像一个自我加入。它的配件只是其他产品。

因此,首先您需要向product_id产品模型表中添加一个(带有迁移)。这product_id将用于引用“父母”。

然后尝试在您的 Product 模型中添加这样的内容:

has_many :accessories, class_name: "Product", foreign_key: :product_id
belongs_to :parent_product, class_name: "Product", foreign_key: :product_id

所以当你手里有一个产品时,如果它是一个配件,你就去@product.parent_product获取父级,如果你手里有一个“父级”,你就去@product.accessories,它会返回一个数组。

由于您可能经常从父产品加载附件,includes因此向其添加一条语句以自动加载附件。

在此处了解有关“开箱即用”方法的更多信息。这些包括从“父级”等中添加和删除“附件”的简单直接的方法(如@product.acceesories = [array of accessories]

于 2013-09-15T19:57:52.417 回答
1

实际上,当您attr_accessor在 Ruby 类中定义时,除非您有特定的行为,否则您不需要覆盖属性的 set 方法。这样attr_accessor :accessories就足够了,它将同时创建:get 和 set 方法。

但是我猜你的错误是你必须将数据写入@accessories变量而不是accessories因为属性的值存储在一个以@

于 2013-09-15T17:55:07.993 回答