处理类别/子类别关系Ruby on Rails的最佳方法

我有一个Category和Subcategory模型。 类别有许多子类别,子类别属于类别。 每个子类别当前都有一个位置字段,用于跟踪它所属的类别下的排队位置。

我这样做的问题是每个我需要:position字段对每个类别都是唯一的。 因此,我需要一种方法来检查位置字段对于其特定类别是唯一的,而不是在我的子类别模型中使用validates_uniqueness_of :position 。 任何人有任何想法,或可能以前处理过这个问题?

扩展lucapettes答案,

嵌套集(https://github.com/skyeagle/nested_set)是这样的:

 - category +- category +- category +--- category +- category - category +- category +- category +--- category +- category 

您可以在任何位置向集合添加节点,并将产品与任何类别相关联。

请查看此文件中的方法https://github.com/skyeagle/nested_set/blob/master/lib/nested_set/base.rb

awsome_nested_set的wiki可能有更好的文档, https://github.com/collectiveidea/awesome_nested_set/wiki/Awesome-nested-set-cheat-sheet

例如,您可以向左移动一个项目(例如,在这样的列表中向上移动)category.move_left

要了解此模型及其工作原理,请阅读Joe Celko的SQL in Trees

使用NestedSet进行类别/子类别处理,使用ActsAsList进行位置处理。

我相信这会根据用户IDvalidation名称的唯一性(即名称是每用户唯一的):

 class Report < ActiveRecord::Base validates_uniqueness_of :name, :scope => [:user_id] end 

has_manybelongs_to简单关联可能对您belongs_to 。 如果position是一个整数,你可以在你的控制器中执行order_by :position ,有或没有该位置的唯一性。