Rails-如何根据模型的多个关联来排序



我有两种型号:

#Product
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
attr_accessible :name
...
end
#Category
class Category < ActiveRecord::Base
has_and_belongs_to_many :products, :order => "name ASC"
attr_accessible :name, :priority
end

我想按最高优先级类别订购我的产品,然后按产品名称订购

例如,我有:3类:

  • 糖果,优先级=3
  • 水果,优先级=1
  • 甜点,优先级=2

3种产品:

  • 巧克力冰淇淋,有甜点和糖果类别
  • 饼干,包括甜点和糖果类别
  • 猕猴桃,有糖果、水果和甜点类别

我希望他们这样订购:

  • 猕猴桃(第一,因为水果是最重要的)
  • 巧克力冰淇淋(第二个原因是巧克力先于饼干,它们的类别具有相同的优先级)
  • Cookie

如何在Rails中做到这一点?我不希望我的产品被复制,我知道这样做很容易:

Category.order("priority ASC").each do |cat|
cat.products.order("name ASC").each do |product|
end
end

但在这种情况下,猕猴桃、巧克力冰淇淋和饼干会被复制,因为它们都有几个类别。有没有一种简单的方法可以删除重复项?或者有没有办法直接按类别最高优先级订购产品?

编辑:我想要实现的更多细节

事实上,我想要的是一个巨大的表格,在左边,我有所有的产品(每个独特的产品只有一行)按类别排序。。。这样我就可以有这样的东西:

  • 类别-产品
  • 水果-香蕉
  • 水果-苹果
  • 水果-猕猴桃
  • 甜品-巧克力冰淇淋
  • 甜点-饼干
  • 甜巧克力糖
  • 甜苹果糖

看到了吗?即使水果是甜点和甜食,我也希望它在这张桌子上只出现一次。我希望产品出现在"最重要"的类别中(这就是我考虑"优先级"的原因)。

由于这个巨大的表将用于编辑产品,我希望能够轻松访问产品的属性(每个属性将有一列)。所以我真的需要做尽可能少的数据库请求。


感谢任何能帮助我的人!Kulgar

为了避免重复,您可以尝试使用

Product.joins(:categories).group("products.name").order("categories.priority ASC, products.name ASC")

也许可以试试这个

products = Product.joins(:categories).order("categories.priority ASC, products.name ASC")

这也将获取重复的值。假设你想取名字,也许你可以试试这个

products.map(&:name).uniq

相关内容

  • 没有找到相关文章

最新更新