我有一个具有固定深度的树状关系模型,每个级别都有一个代码属性 - 与此类似;
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,但我没有关系名称供应。
答案 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