这是我试图理解的代码,现在令人困惑的部分是代码中的:p roduct_id,特别是":p roduct_id"的":"部分我的问题是我们应该怎么知道我们应该使用那个":"?
def up
# replace multiple items for a single product in a cart with a single item
Cart.all.each do |cart|
# count the number of each product in the cart
sums = cart.line_items.group(:product_id).sum(:quantity)
sums.each do |product_id, quantity|
if quantity > 1
# remove individual items
cart.line_items.where(product_id: product_id).delete_all
# replace with a single item
item = cart.line_items.build(product_id: product_id)
item.quantity = quantity
item.save!
end
end
end
end
符号:
- 基本上是字符串常量
- 创建一次。
:product_id
无论何时使用它,都将是同一个对象。因此,它们可以节省内存。另一方面,如果你多次编写"product_id"
,你基本上是在创建尽可能多的字符串对象。 - 不能利用正则表达式和插值(大部分)的好处,除非您在符号上使用to_s方法
简而言之,对不需要处理或修改的短字符串常量使用符号。
例如:符号非常适合哈希等中的键。 明白了吗?
符号只是指向包含其名称的对象的指针,而字符串始终是不同的对象。
如果要在代码中多次重复名称,请使用一个符号,这相当于只使用一个对象。
例如,如果在代码中使用字符串"France"
100 次,则更愿意使用 :France
。优点是,在第一种情况下,您将实例化 100 个对象,而在第二种情况下,只需实例化一个对象。
在您的示例中,也许您会感到困惑product_id: product_id
因为 Hash 是以 JSON 样式表示的哈希。这相当于:product_id => product_id