查询作为Ruby / Rails中的条件语句

时间:2013-11-16 00:47:34

标签: ruby-on-rails-3.1 ruby-1.9.3

使用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控制台的快照

enter image description here

如您所见,找不到LineItem中的产品ID为10。但就我而言,它违背了我迄今为止所相信的一切。有人可以对此有所了解吗?

1 个答案:

答案 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。