处理类别/子类别关系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_many
和belongs_to
简单关联可能对您belongs_to
。 如果position是一个整数,你可以在你的控制器中执行order_by :position
,有或没有该位置的唯一性。