使用Rails从Agile Web Development跟踪Depot应用程序。 有一种方法我感到困惑。我以为我理解它,直到我在irb中尝试它。所以这是方法:
def add_product(product_id)
current_item = line_items.find_by_product_id(product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product_id)
end
current_item
end
根据我的理解,这只是一种方法,它首先在LineItems中找到一个记录,其中产品ID为给定输入(假设它是10)。然后它将它存储在current_item变量中。条件说'如果找到了产品ID,则将数量加1,否则创建该记录的新实例,产品ID等于10'
这是我的rails控制台的快照
如您所见,找不到LineItem中的产品ID为10。但就我而言,它违背了我迄今为止所相信的一切。有人可以对此有所了解吗?
答案 0 :(得分:2)
看起来line
是一个空集合(确切地说是ActiveRecord :: Relation)所以它是Ruby中的东西而不是nil。这就是为什么当您拨打if line
并执行puts 'I'm true and happy'
时它返回true的原因。它是ActiveRecord :: Relation的原因是因为您&#39 ;重新使用 where 查询。
在软件仓库应用程序中,他们通过调用不同的line_items.find_by_product_id(product_id)
来进行查询。它找到匹配条件的第一条记录。
查看Rails指南,了解更多信息 - http://guides.rubyonrails.org/active_record_querying.html(第15条)
PS看起来在Rails 4中不推荐使用这种类型的查询,因此不确定您正在查看哪个版本的Agile Web Development with Rails。