通过数值迭代写入ActiveRecord列

时间:2014-01-09 06:39:25

标签: ruby activerecord sinatra

我有一个数据库,我想存储订单。我不想在一个字段中将每个订单项捆绑在一起,除非有充分的理由这样做。列item_1item_2item_3item_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:syntax   错误,意外的tIDENTIFIER,期待keyword_end @ order.line_item   = item [“quantity”]'x'item [“item”] ^

/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

1 个答案:

答案 0 :(得分: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模型并设置association

,而不是拥有固定数量的LineItem属性。
class LineItem < ActiveRecord::Base
  belongs_to :order
end

class Order < ActiveRecord::Base
  has_many :line_items
end

这允许您分配任意数量的订单项。假设LineItem具有positionquantityitem属性,则可以使用以下内容:

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