我有一个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 语句中的条件顺序必须与组条件匹配。