Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 - Fatal编程技术网

Ruby on rails Rails从不同模型上的嵌套属性一次创建多个记录

Ruby on rails Rails从不同模型上的嵌套属性一次创建多个记录,ruby-on-rails,Ruby On Rails,在我的应用程序中,我有模型PurchaseOrder和PurchaseOrderList。当我创建采购订单时,它会使用嵌套表单更新表purchase\u orders和purchase\u order\u List 现在我想能够添加一个按钮更新采购订单/显示库存。当我点击此按钮时,将在表stockdiaries上创建一条新记录,其产品、单位和价格与采购订单上的相同 其逻辑是,首先创建采购订单,然后在收到货物时单击按钮更新库存 我想到的最好方法是在PurchaseOrders控制器上创建此方法:

在我的应用程序中,我有模型PurchaseOrder和PurchaseOrderList。当我创建采购订单时,它会使用嵌套表单更新表purchase\u orders和purchase\u order\u List

现在我想能够添加一个按钮更新采购订单/显示库存。当我点击此按钮时,将在表stockdiaries上创建一条新记录,其产品、单位和价格与采购订单上的相同

其逻辑是,首先创建采购订单,然后在收到货物时单击按钮更新库存

我想到的最好方法是在PurchaseOrders控制器上创建此方法:

 def update_stock
   @purchase_order_list = PurchaseOrderList.where(PURCHASE_ORDER: params[:ID])
   @stockdiary = Stockdiary.create(PRODUCT: @purchase_order_list.PRODUCT, UNITS: @purchase_order_list.UNITS, PRICEBUY: @purchase_order_list.PRICEBUY)
   flash[:notice] = "Stock updated successfully."
   redirect_to(:action => 'show', :ID => @purchase_order.ID)
 end
在我的采购订单/展会中:

<%= link_to "Update Stock", { controller: :purchase_orders, action: :update_stock, ID: @purchase_order.ID} %>

但这会引起错误

undefined method `PRODUCT' for
#<PurchaseOrderList::ActiveRecord_Relation:0x007f1efeff4898>
未定义的方法“产品”
#
但在采购订单列表表中有一列PRODUCT

请注意,我在方法中只包含了采购订单清单和库存日记中常见的列,其他列(如id或状态)与此问题无关。列名是大写的,因为我正在现有数据库上构建应用程序


从采购订单创建库存日记的正确方法是什么?

已更新

Rails正在从此查询返回一个ActiveRecord关系

@purchase_order_list = PurchaseOrderList.where(PURCHASE_ORDER: params[:ID])
这是因为您使用了
where
,所以ActiveRecord返回一个可能包含多条记录的关系。如果您只需要一条记录,或者即使您知道只有一条记录,您也应该使用
find\u by

因此,您可以:

# change where to find_by
@purchase_order_list = PurchaseOrderList.find_by(PURCHASE_ORDER: params[:ID])
# and then this will work
@stockdiary = Stockdiary.create(PRODUCT: @purchase_order_list.PRODUCT, UNITS: @purchase_order_list.UNITS, PRICEBUY: @purchase_order_list.PRICEBUY)
或。。。如果您希望
在其中
或可能有多条记录,则可以循环:

@purchase_order_list = PurchaseOrderList.where(PURCHASE_ORDER: params[:ID])
# and then loop through you potentially multiple records in @purchase_order_list
@purchase_order_list.each do |po|
  @stockdiary = Stockdiary.create(PRODUCT: po.PRODUCT, UNITS: po.UNITS, PRICEBUY: po.PRICEBUY)
end
或先使用

@stockdiary = Stockdiary.create(PRODUCT: @purchase_order_list.first.PRODUCT, UNITS: @purchase_order_list.first.UNITS, PRICEBUY: @purchase_order_list.first.PRICEBUY)
通常这意味着您没有在PurchaseOrder模型中放置

采购订单

class PurchaseOrder
  accepts_nested_attributes_for :purchase_order_list
end

谢谢你的回答。但我已经把它放在我的模型里了。我可以使用嵌套表单创建采购订单,它可以在采购订单列表表上正确创建记录。如果我没有,那就不行了。无论如何,据我所知,正确的语法是“接受嵌套属性(accepts)for:purchase\u order\u list”(复数)好的,是的。我有一个打字错误,我没有仔细阅读你的问题。现在我明白了。让我看看。“我知道我以前在类似的案例中也犯过这个错误。”Catmal更新道。将
where
更改为
find\u by
如果您只需要一条记录,或者如果您需要多条记录,那么您应该循环查看
@purchase\u order\u list
并根据您的需求为每一条记录创建一个
股票日记,这非常感谢。我需要循环tho(我想为每个采购订单列表创建一个库存日记)。但我不确定语法。如果不太麻烦的话,你能给我举个例子吗?