你如何通过遥远的关系对集合进行排序?

时间:2013-10-01 20:43:40

标签: ruby-on-rails ruby-on-rails-4

我有一个具有固定深度的树状关系模型,每个级别都有一个代码属性 - 与此类似;

class Category < ActiveRecord::Base 
  has_many :sub_categories

  default_scope order(:code)
end

class SubCategory < ActiveRecord::Base
  belongs_to  :category
  has_many    :items

  def self.sorted
    self.joins(:category).order('"categories".code ASC, "sub_categories".code')
  end
end

class Item < ActiveRecord::Base
  belongs_to :sub_category

  def self.sorted
    # what goes here?
  end
end

Category.all获取categories.code排序的所有类别。

SubCategory.sorted获取categories.code, sub_categories.code排序的所有sub_categories。我使用这种方法是因为default_scope : joins(:categories).order('categories.code, sub_categories.code')使.find返回只读记录。

我想致电Items.sorted并获取categories.code, sub_categories.code, items.code订购的所有商品,但我无法弄清楚如何。我想我需要第二个.joins,但我没有关系名称供应。

2 个答案:

答案 0 :(得分:1)

试试这个:

class Item < ActiveRecord::Base
  belongs_to :sub_category

  def self.sorted
    # do not need self here as that is implied
    joins(sub_category: :category).
    order('"categories".code ASC, "sub_categories".code, "items".code')
  end
end

请参阅有关加入嵌套关联的文档{{3p>

答案 1 :(得分:0)

这样可行,但似乎应该有更好的方法;

def self.sorted
  joins(:sub_category).
    joins('INNER JOIN "categories" on "categories".id = "sub_categories".category_id').
    order('"categories".code ASC, "sub_categories".code ASC, "items".number ASC')
end