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中?告诉我这是否是你想要做的:对不起,我想的是另一种方式。成功了。谢谢。对不起,我想换一种方式。成功了。谢谢