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

时间:2012-02-13 22:37:05

标签: ruby-on-rails ruby ruby-on-rails-3

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

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

3 个答案:

答案 0 :(得分:1)

使用NestedSet进行类别/子类别处理,使用ActsAsList进行排名处理。

答案 1 :(得分:1)

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

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

has_manybelongs_to之间的简单关联可能适合您。如果position是一个整数,您可以在控制器中{@ 1}}执行或不使用该位置的唯一性。

答案 2 :(得分:1)

扩展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

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