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

时间:2017-01-08 17:12:46

标签: ruby-on-rails

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

现在我希望能够在purchase_orders / show上添加按钮更新库存。单击此按钮时,将在表库存中创建新记录,其中包含与采购订单相同的产品,单位和价格。

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

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

CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
combinedTypeSolver.add(new JavaParserTypeSolver("path to the sourcefiles"));
JavaParserFacade j=JavaParserFacade.get(combinedTypeSolver);
SymbolReference<MethodDeclaration> ref = j.solve((MethodCallExpr) n);

和我的purchase_orders / show:

 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} %>

但在purchase_order_lists表上有一列PRODUCT。

请注意,我在方法中仅包含purchase_order_lists和stockdiaries共有的列,因为其他人(作为id或status)不关心此问题。列名称是资本,因为我在现有数据库上构建应用程序。

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

1 个答案:

答案 0 :(得分:1)

<强>更新

Rails从此查询返回 ActiveRecord Relation

where

这是因为您使用了find_by,因此ActiveRecord会返回一个可能包含多条记录的关系。如果您只想要一条记录,或者即使您知道只有一条记录,那么您应该使用# 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)

所以你可以这样做:

where

或者......如果你想要@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 或者可能有多条记录,那么你可以循环:

first

或使用@stockdiary = Stockdiary.create(PRODUCT: @purchase_order_list.first.PRODUCT, UNITS: @purchase_order_list.first.UNITS, PRICEBUY: @purchase_order_list.first.PRICEBUY)

class PurchaseOrder
  accepts_nested_attributes_for :purchase_order_list
end

通常这意味着您没有将accepts_nested_attributes_for放在PurchaseOrder模型中。

<击>的的PurchaseOrder

<击>
pip install --help

<击>