2012-02-13 36 views
0

我有一個類別和子類別模型。類別有許多子類別,子類別屬於類別。每個子類別目前都有一個位置字段,用於跟蹤它所屬類別下的排列位置。處理類別/子類別關係的最佳方式Ruby on Rails

我這樣做的方式存在的問題是每個我需要:position字段對每個類別都是唯一的。因此,我不需要在我的子類別模型中使用validates_uniqueness_of :position,我需要一種方法來檢查位置字段對於其特定類別是否是唯一的。任何人有任何想法,或可能之前處理這個問題?

回答

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維基可能有一些更好的文檔,https://github.com/collectiveidea/awesome_nested_set/wiki/Awesome-nested-set-cheat-sheet

例如,你可以移動的項目左邊(例如起來像這樣的列表)category.move_left

要了解這個模型,爲什麼它的工作原理,閱讀 Trees in SQL by Joe Celko

+0

謝謝,我記得有一點在學校樹木。應該多加註意。當你決定使用NestedList而不是簡單的belongs_to和has_many關係時,你能建議我嗎? – ruevaughn 2012-02-15 05:10:13

+0

速度是深樹的主要優勢 – macarthy 2012-02-16 16:47:01

+0

我正在努力實現它,我把'acts_as_nested_set'放在我的類別模型,子類別模型和產品模型中嗎?我是否需要將lft,rgt和parent_id添加到它們全部? – ruevaughn 2012-02-16 21:35:57

1

使用NestedSet進行類別/子類別處理,使用ActsAsList進行位置處理。

+0

我也將有屬於小類產品, NestedSet也會與這種關係一起工作嗎? – ruevaughn 2012-02-14 04:55:21

+0

事實上,嵌套集合中的葉子已經排序,因此您可以使用嵌套集合。是的,您可以在此模型中的子類別中使用產品。 – macarthy 2012-02-14 08:29:04

+0

添加了更多詳細信息和嵌套集的解釋的答案 – macarthy 2012-02-14 08:43:37

1

我相信這驗證了獨特名字的基於用戶ID(即名稱爲每個用戶唯一的):

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

一個簡單的關聯作爲has_manybelongs_to可以爲你工作。如果position是一個整數,那麼您可以在您的控制器中執行order_by :position,該位置具有或不具有唯一性。