gpt4 book ai didi

sql - 按子模型属性对 ActiveRecord 模型进行排序?

转载 作者:行者123 更新时间:2023-11-29 05:46:31 24 4
gpt4 key购买 nike

假设我有一个模型 Category,其中 has_many Items。现在,我想展示一个类别表,这些类别根据项目的各种属性排序。例如,将价格最高的商品放在顶部。或者根据评分最高的项目对类别进行排序。或者根据最近的项目对类别进行排序(即,具有最近项目的类别将排在第一位)。

class Category < ActiveRecord::Base
has_many :items

# attributes: name
end

class Item < ActiveRecord::Base
belongs_to :category

# attributes: price, rating, date,
end

哪种方法最好?

  1. 在类别模型中维护额外的列以保存用于排序的属性(即该类别中的最高商品价格或最佳评级)。我以前做过,但有点难看,每次项目更改时都需要更新类别模型
  2. order 子句中的一些神奇的 SQL 咒语?
  3. 还有别的吗?

我能想出的最好的办法是这个 SQL,用于生成按包含项目的最高价格排序的类别列表。

select categories.name, max(items.price) from categories join items group by categories.name

虽然不确定这如何转化为 Rails 代码。如果我想按最新商品的价格对类别进行排序,则此 SQL 也不起作用。出于明显的性能原因,我真的试图将其保留在数据库中。

最佳答案

假设项目模型中列出的属性是数据库列,您可以做很多事情。

最简单的可能是named_scopes

/app/models/category.rb

class Category < ActiveRecord::Base
has_many :items

# attributes: name
named_scope :sorted_by_price, :joins => :items, :group => 'users.id', :order => "items.price DESC"
named_scope :sorted_by_rating, :joins => :items, :group => 'users.id', :order => "items.rating DESC"

named_scope :active, :condition => {:active => true}


end

然后您可以只使用 Category.sorted_by_price 返回按价格从高到低排序的类别列表。 named_scopes 的优点是可以让你链接多个相似的查询。使用上面的代码,如果您的类别有一个名为 active 的 bool 值。你可以使用 Category.active.sorted_by_price 获取按最贵商品排序的事件类别列表。

关于sql - 按子模型属性对 ActiveRecord 模型进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1148915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com