Ruby on rails 在Rails中处理实例方法的nil值

Ruby on rails 在Rails中处理实例方法的nil值,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个产品型号,它有许多项目。该应用程序列出了属于产品的唯一项。因此,将物品视为库存。下面的查询获取产品的特色项目并删除第一个项目(不相关,但它将成为特色项目,如果您好奇,将单独显示) 问题是当feaured_items为空时,该方法返回nil,而不是关系对象。这意味着,如果我在没有项目的产品上调用@product.featured\u items.any?,则会出现错误。如果删除sort_by块,则会得到一个空的关系对象 除了以下方法外,还有其他好方法处理此问题: items = items

我有一个
产品
型号,它有许多
项目
。该应用程序列出了属于产品的唯一项。因此,将物品视为库存。下面的查询获取产品的特色项目并删除第一个项目(不相关,但它将成为特色项目,如果您好奇,将单独显示)

问题是当feaured_items为空时,该方法返回nil,而不是关系对象。这意味着,如果我在没有项目的产品上调用
@product.featured\u items.any?
,则会出现错误。如果删除
sort_by
块,则会得到一个空的关系对象

除了以下方法外,还有其他好方法处理此问题:

items = items_in_stock.select("DISTINCT ON (condition) id, items.*").order(:condition, :price)
if items.any?
  items.sort_by { |item| item[:price] }[1..-1]
end

我无法反转查询的顺序,因为我得到一个错误,即order by语句中的条件顺序必须与组条件匹配。

我很困惑…为什么要调用
.any?
,因为在ruby中
nil
被视为
false
。如果你得到的是
nil
,那么你就知道你没有任何特色商品

我在
irb
中运行了这个,我认为您的问题是[1..-1]

a = []
# => []
a.sort_by { |w| w.length }
# => []
a.sort_by { |w| w.length }[1..-1]
# => nil
最简单的方法就是这样做

items = items_in_stock.select("DISTINCT ON (condition) id, items.*")
  .order(:condition, :price)
  .sort_by { |item| item[:price] }
items.any? ? items[1..-1] : items

那么,除非有必要,否则您实际上不必检查代码的其他部分。

我很困惑……既然在ruby中
nil
被视为
false
,为什么要调用
.any?
。如果你得到的是
nil
,那么你就知道你没有任何特色商品

我在
irb
中运行了这个,我认为您的问题是[1..-1]

a = []
# => []
a.sort_by { |w| w.length }
# => []
a.sort_by { |w| w.length }[1..-1]
# => nil
最简单的方法就是这样做

items = items_in_stock.select("DISTINCT ON (condition) id, items.*")
  .order(:condition, :price)
  .sort_by { |item| item[:price] }
items.any? ? items[1..-1] : items

然后,除非有必要,否则您实际上不必检查代码的其他部分。

而不是
if items。任何?
您可以使用
除非items。blank?
如果为零或为空,它将不会运行该条件

项目。空白?
同时检查
项目。空白?
项目。无?

当然,你也可以在你的特色商品中使用它

items = items_in_stock.select("DISTINCT ON (condition) id, items.*")
  .order(:condition, :price)
  .sort_by { |item| item[:price] }[1..-1]
return Array.new if items.blank?
这样,您就知道无论发生什么情况,结果都将是一个数组


对于,您可以对
nil
对象使用
.blank?
,它对
nil
本身起作用,
nil.blank?
返回
true

而不是
if items。任何?
都可以使用
除非items。blank?
如果为nil或为空,则不会运行该条件

项目。空白?
同时检查
项目。空白?
项目。无?

当然,你也可以在你的特色商品中使用它

items = items_in_stock.select("DISTINCT ON (condition) id, items.*")
  .order(:condition, :price)
  .sort_by { |item| item[:price] }[1..-1]
return Array.new if items.blank?
这样,您就知道无论发生什么情况,结果都将是一个数组


对于,您可以在
nil
对象上使用
.blank?
,它对
nil
本身起作用,
nil.blank?
返回
true

“问题是当
feaured\u项
为空时”我在代码中的任何地方都看不到
特征项
。@Phrogz抱歉,我修复了它。“问题在于
feaured\u项
为空时“我在您的代码中的任何地方都看不到
特色项目
。@Phrogz抱歉,我已经修复了它。我想这是真的,但为了保持一致性。通常,ActiveRecord返回一个关系对象。调用
any?
会告诉您数组是否有元素。谢谢。关于从数组中提取第一个值,但返回一个数组(即使它是空的)有什么建议吗?顺便说一句,在其他情况下,我可能会调用
.size
或它的其他任何内容,因此它无论如何都会失败,除非它不是空的。所以
any?
不是唯一的问题。正如我所说,这是一个一致性的问题。我想这几乎是意料之中的。不过,这感觉有点俗气。我可能不得不修改如何对待“特色项目”和“特色项目”,因为它们在视图中得到了单独的处理。是的,这确实让人感觉很不舒服。您可能需要创建一些实例方法来处理这些问题,并将查找本身作为一个方法。通常,ActiveRecord返回一个关系对象。调用
any?
会告诉您数组是否有元素。谢谢。关于从数组中提取第一个值,但返回一个数组(即使它是空的)有什么建议吗?顺便说一句,在其他情况下,我可能会调用
.size
或它的其他任何内容,因此它无论如何都会失败,除非它不是空的。所以
any?
不是唯一的问题。正如我所说,这是一个一致性的问题。我想这几乎是意料之中的。不过,这感觉有点俗气。我可能不得不修改如何对待“特色项目”和“特色项目”,因为它们在视图中得到了单独的处理。是的,这确实让人感觉很不舒服。您可能需要创建一些实例方法来处理这些问题,并将查找本身作为一个方法。您可以实际执行
nil.blank?
,它将返回
true
。去测试一下。为了证明这一点:你能对你的帖子进行编辑吗,这样我就可以:
你上一次对这个答案投票是在19小时前,现在你的投票被锁定了,除非这个答案被编辑了。
甜蜜投票:)。很抱歉,我看到的是Ruby,而不是Rails。您实际上可以执行
nil.blank?
,它将返回
true
。去测试一下。为了证明这一点:你能对你的帖子进行编辑吗,这样我就可以:
你上一次对这个答案投票是在19小时前,现在你的投票被锁定了,除非这个答案被编辑了。
甜蜜投票:)。很抱歉,我在看Ruby,不是Rails。