【问题标题】:Query as a conditional statement in Ruby/Rails查询作为 Ruby/Rails 中的条件语句
【发布时间】:2013-11-16 00:47:34
【问题描述】:

正在关注 Agile Web Development with Rails 的 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 中 10 的产品 ID。但就我的情况而言,这与我迄今为止所相信的一切背道而驰。有人能解释一下吗?

【问题讨论】:

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


    【解决方案1】:

    看起来 line 是一个空集合(确切地说是 ActiveRecord::Relation),所以它是 Ruby 中的东西,而不是 nil。这就是为什么当您调用 if line 并执行 puts 'I'm true and happy' 时它返回 true 的原因。它是 ActiveRecord::Relation 的原因是因为您正在使用 where 查询。

    在 Depot 应用程序中,他们通过调用 line_items.find_by_product_id(product_id) 进行查询,这是不同的。它找到符合条件的第一条记录。

    在此处查看 Rails 指南以获取更多信息 - http://guides.rubyonrails.org/active_record_querying.html(第 15 节)

    PS 看起来这种类型的查询在 Rails 4 中已被弃用,因此不确定您正在查看的是哪个版本的 Rails 敏捷 Web 开发。

    【讨论】:

      猜你喜欢
      • 2013-07-30
      • 1970-01-01
      • 2013-11-01
      • 2012-02-01
      • 2017-11-07
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多