Rails - 如何通过它订购模型有很多关联?

时间:2012-12-18 08:26:40

标签: ruby-on-rails model-associations has-and-belongs-to-many

我有两种模式:

#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个产品:

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

我希望他们这样订购:

  • Kiwi(首先因为水果是最优先的)
  • 巧克力冰淇淋(第二个因为巧克力来自饼干,它们都有相同优先级的类别)
  • 缓存

我怎么能在Rails中这样做? 我不希望我的产品被复制,我知道这样做很容易:

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

但在这种情况下,新西兰,巧克力冰淇淋和饼干会被复制,因为它们都有几个类别。 有没有一种简单的方法来删除重复?或者有没有办法直接按类别优先顺序订购产品?

编辑:有关我想要实现的内容的更多详细信息

我想要的是一张巨大的桌子,在左边,我有所有产品(每个独特产品只有一行)按类别排序......所以我可以有这样的东西:

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

请参阅?即使水果是甜点和甜点,我希望它只出现在这张桌子中一次。我希望产品出现在他们“最重要”的类别中(这就是我考虑“优先级”的原因)。

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


感谢任何可以帮助我的人! Kulgar

2 个答案:

答案 0 :(得分:7)

为避免重复,您可以试试这个,

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

答案 1 :(得分:1)

也许试试这个

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

这也将获取重复的值。让我们说你想取名字,也许你可以试试这个

products.map(&:name).uniq