Relacja sama do siebie

Witam,
Jak zamodelowac relację w tabeli Kategoria kiedy wiemy że każda kategoria posiada:
id
nazwa
id_rodzica

Pozdrawiam?

Pisane z palca, ale coś w ten deseń:

[code=ruby]create_table :categories do |t|
t.column :parent_id, :integer
t.column :name, :string
end

class Category < ActiveRecord::Base
has_many :child_categories, :class_name => ‘Category’, :foreign_key => :parent_id
belongs_to :parent_category, :class_name => ‘Category’, :foreign_key => :parent_id
end[/code]

category = Category.find(:first) category.child_categories # => tablica kategorii category.parent_category # => kategoria rodzic

Zamiast

class Category < ActiveRecord::Base has_many :child_categories, :class_name => 'Category', :foreign_key => :parent_id belongs_to :parent_category, :class_name => 'Category', :foreign_key => :parent_id end
można skorzystać z makra acts_as_tree:

[code=ruby]class Category < ActiveRecord::Base
acts_as_tree
end

c = Category.find(:first)

dostajemy następujące metody

c.parent
c.children
c.siblings
c.self_and_siblings
c.root
c.ancestors[/code]

Dziękuję bardzo o to własnie mi chodziło.

Moim zdaniem do hierarchicznych struktur danych w bazie najlepiej wykorzystać: http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
…i ku mojemu miłemu zaskoczeniu ktoś już zaimplementował to w ROR: http://opensource.symetrie.com/trac/better_nested_set/

Wow - wygląda nieźle… ale czy działa również z innymi bazami danych niż MySQL? Nie znalazłem informacji na ten temat na stronie pluginu. Teoretycznie powinno - ale wiadomo jak to jest w praktyce…
Poza tym - używałeś już tego w produkcji?

[quote=apohllo]Wow - wygląda nieźle… ale czy działa również z innymi bazami danych niż MySQL? Nie znalazłem informacji na ten temat na stronie pluginu. Teoretycznie powinno - ale wiadomo jak to jest w praktyce…
Poza tym - używałeś już tego w produkcji?[/quote]
Rozwiązania tak, pluginu nie.
Rails-ów dopiero się uczę i jeszcze nie zrobiłem w nich większego projektu.
Plugin, który wrzuciłem na grupę był pierwszym wynikiem zapytania z google. Podejrzewam, że istnieje masę innych rozwiązań.

[quote=apohllo]Wow - wygląda nieźle… ale czy działa również z innymi bazami danych niż MySQL? Nie znalazłem informacji na ten temat na stronie pluginu. Teoretycznie powinno - ale wiadomo jak to jest w praktyce…
Poza tym - używałeś już tego w produkcji?[/quote]
Nie trzeba było aż tak daleko szukać:
http://api.rubyonrails.org/classes/ActiveRecord/Acts/NestedSet/ClassMethods.html
:wink:

[quote=lucassus]Nie trzeba było aż tak daleko szukać:
http://api.rubyonrails.org/classes/ActiveRecord/Acts/NestedSet/ClassMethods.html
;)[/quote]
Tak, ale czasami nawet nie przyjdzie nam do głowy żeby poszukać :slight_smile:

Jak apohllo napisał - acts_as_tree, lub dla bardziej wymagających - acts_as_nested_set. Pamiętaj, że w RoR 2 oba makra zostały wydzielone z “jądra” do osobnych pluginów. Na szczęście nie trzeba podawać pełnej ścieżki, wystarczy script/plugin install acts_as_tree

Co to są te makra? :slight_smile:

Skrót myślowy :wink: