我有一个数据库,我想存储订单。我不想在一个字段中将每个订单项捆绑在一起,除非有充分的理由这样做。列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: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
答案 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] = ...
删除临时变量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
具有position
,quantity
和item
属性,则可以使用以下内容:
@customer_order.each.with_index(1) do |item|
@order.line_items.create(position: index, quantity: item['quantity'], item: item['item'])
end