Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails中同一对象中的父产品和子产品_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails rails中同一对象中的父产品和子产品

Ruby on rails rails中同一对象中的父产品和子产品,ruby-on-rails,ruby,Ruby On Rails,Ruby,我所处的情况是,我需要在同一对象中使用产品及其配件。我得到的产品代码如下: @products = Product.all 这很好。为了在同一个对象中获得每个产品的配件,我做了以下工作: @products.each do |product| @product.accessories = Product.find_by_parent_id(product.id) end 我试过这个,但当我叫@products时,我只有产品,没有配件 在模型中,我打过电话 attr_accessor :

我所处的情况是,我需要在同一对象中使用产品及其配件。我得到的产品代码如下:

@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
我没有得到任何错误,但不幸的是,我没有得到配件以及。这是买配件的正确方法吗?或者有没有其他方法来实现这一点?如果我做得对,那么我犯了什么错误


提前感谢。

实际上,当您在Ruby类中定义
attr\u accessor
时,您不需要重写属性的set方法,除非您有特定的行为。所以
attr\u accessor:accessories
就足够了,它将同时创建:get和set方法


但我想,您的错误是,您必须将数据写入
@associates
变量,而不是
associates
,因为属性的值存储在一个实例变量中,该实例变量实际上以
@

开头,在Ruby类中定义
attr\u accessor
时,除非有特定的行为,否则不需要重写属性的set方法。所以
attr\u accessor:accessories
就足够了,它将同时创建:get和set方法


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

开头的实例变量中。我认为您需要更多地依赖数据库,因为Rails正是为此而设计的,并且提供了很多现成的方法,可以避免重新发明的方法

因为您的每个产品都引用了其他产品,所以它就像一个自连接。它的配件只是其他产品

因此,首先需要将
product\u id
添加到产品模型表中(使用迁移)。此
产品id
将用于引用“家长”

然后尝试在您的产品模型中添加类似的内容:

has_many :accessories, class_name: "Product", foreign_key: :product_id
belongs_to :parent_product, class_name: "Product", foreign_key: :product_id
因此,当你手中有一个产品时,如果它是一个配件,你只需去
@product.parent\u product
就可以得到它的家长,如果你手中有一个“家长”,你只需去
@product.associates
,它就会返回一个他们的数组

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


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

我认为您需要更多地依赖数据库,因为Rails正是为此而设计的,并且提供了很多现成的方法,可以避免重新发明的方法

因为您的每个产品都引用了其他产品,所以它就像一个自连接。它的配件只是其他产品

因此,首先需要将
product\u id
添加到产品模型表中(使用迁移)。此
产品id
将用于引用“家长”

然后尝试在您的产品模型中添加类似的内容:

has_many :accessories, class_name: "Product", foreign_key: :product_id
belongs_to :parent_product, class_name: "Product", foreign_key: :product_id
因此,当你手中有一个产品时,如果它是一个配件,你只需去
@product.parent\u product
就可以得到它的家长,如果你手中有一个“家长”,你只需去
@product.associates
,它就会返回一个他们的数组

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


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

您是否在Rails 4中?告诉我这是否是您想要做的:您是否在Rails 4中?告诉我这是否是你想要做的:对不起,我想的是另一种方式。成功了。谢谢。对不起,我想换一种方式。成功了。谢谢