Ruby on rails Rails从不同模型上的嵌套属性一次创建多个记录
在我的应用程序中,我有模型PurchaseOrder和PurchaseOrderList。当我创建采购订单时,它会使用嵌套表单更新表purchase\u orders和purchase\u order\u List 现在我想能够添加一个按钮更新采购订单/显示库存。当我点击此按钮时,将在表stockdiaries上创建一条新记录,其产品、单位和价格与采购订单上的相同 其逻辑是,首先创建采购订单,然后在收到货物时单击按钮更新库存 我想到的最好方法是在PurchaseOrders控制器上创建此方法:Ruby on rails Rails从不同模型上的嵌套属性一次创建多个记录,ruby-on-rails,Ruby On Rails,在我的应用程序中,我有模型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(我想为每个采购订单列表创建一个库存日记)。但我不确定语法。如果不太麻烦的话,你能给我举个例子吗?