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。