Witam,
Jak zamodelowac relację w tabeli Kategoria kiedy wiemy że każda kategoria posiada:
id
nazwa
id_rodzica
Pozdrawiam?
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)
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
[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ć
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?
Skrót myślowy