【问题标题】:Writing to ActiveRecord columns via numerical iteration通过数值迭代写入 ActiveRecord 列
【发布时间】:2014-01-09 16:51:28
【问题描述】:

我有一个要在其中存储订单的数据库。我不想将每个订单项捆绑在一个字段中,除非有充分的理由这样做。有列item_1、item_2、item_3、item_4;我想遍历每个订单项直到完成。

我得到的错误是:

语法错误: /Users/chadsakonchick/Projects/restlessnapkin/charge.rb:47:语法 错误,意外的 tSTRING_BEG,期待 keyword_end @order.line_item = item["quantity"] 'x' item["item"] ^ /Users/chadsakonchick/Projects/restlessnapkin/charge.rb:47:语法 错误,意外的 tIDENTIFIER,期待 keyword_end @order.line_item = 项目[“数量”] 'x' 项目[“项目”] ^

/order.rb

# Write order to the database
@order = Order.new
@order.venue_id = @venue
@order.customer_id = @customer.id    

# Loop each line item
x = 1
@customer_order.each do |item|
  line_item = "item_#{x}"
  @order.line_item = item["quantity"] 'x' item["item"]
  x += 1
end

【问题讨论】:

  • @order.line_item 是字符串"#{item["quantity"]} x #{item["item"]}" 还是数字item["quantity"] * item["item"]?
  • 我认为您也不希望拥有固定数量的订单项。创建LineItem 模型并使用association (Order has_many :line_items / LineItem belongs_to :order)。

标签: ruby activerecord sinatra


【解决方案1】:

你的代码有两个问题:

创建订单项字符串

这会引发语法错误:

item["quantity"] 'x' item["item"]

改用字符串插值:

"#{item["quantity"]} x #{item["item"]}"

将字符串分配给属性

您的代码将字符串分配给@order.line_item,即分配给line_item 属性。 line_item 变量从未被使用过:

line_item = "item_#{x}"
@order.line_item = ...

改用ActiveRecord::AttributeMethods#[]=:

line_item = "item_#{x}"
@order[line_item] = ...

您可以使用Enumerator#with_index 摆脱临时变量x:

@customer_order.each.with_index(1) do |item, index|
  @order["item_#{index}"] = "#{item["quantity"]} x #{item["item"]}"
end

请注意,如果有超过 4 个项目,这将引发 ActiveModel::MissingAttributeError,因为没有 item_5 属性。因此,与其拥有固定数量的item_x 属性,不如创建一个单独的LineItem 模型并设置一个association:

class LineItem < ActiveRecord::Base
  belongs_to :order
end

class Order < ActiveRecord::Base
  has_many :line_items
end

这允许您分配任意数量的订单项。假设LineItem 具有属性position、quantity 和item,这样的事情会起作用:

@customer_order.each.with_index(1) do |item|
  @order.line_items.create(position: index, quantity: item['quantity'], item: item['item'])
end

【讨论】:

  • 我希望我能给你 100 次投票,以获得所有这些绝妙的建议。我让一切都 100% 正常工作,并且对订单行项目没有限制。感谢您提出将 line_items 从订单表中分离出来的建议,那真是一个灯泡时刻。
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多