0

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

# product.rb
has_many :items_in_stock, -> { Item.in_stock }, class_name: 'Item'
def featured_items
  items_in_stock.select("DISTINCT ON (condition) id, items.*")
    .order(:condition, :price)
    .sort_by { |item| item[:price] }[1..-1]
end

# item.rb
scope :in_stock, -> { where(status: 'in_stock') }

问题是当它们feaured_items为空时,该方法返回 nil,而不是关系对象。这意味着如果我调用@product.featured_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 语句中的条件顺序必须与组条件匹配。

4

2 回答 2

3

我很困惑......为什么要调用.any?它,因为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

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

于 2013-07-15T23:38:31.570 回答
2

如果它为 nil 或为空,你可以使用它,而不是if items.any?你可以使用unless items.blank?它,它不会运行条件

items.blank?同时检查items.empty?items.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?

这样你就知道结果将是一个数组,无论如何

而对于证明,你可以.blank?在一个nil对象上使用,它对nil自己起作用,nil.blank?返回true

于 2013-07-16T12:36:41.013 回答