Witam,
jestem w trakcie tworzenia aplikacji w Ruby On Rails. Doszedłem do momentu, w którym muszę napisać forum dyskusyjne. Jednak nie do końca wiem jak się za to zabrać (wiele lat w PHP robi swoje:D).
Skoro Rails jest architekturą REST-owską, wiem, że muszę dla każdego z “komponentów/tabeli” przypisać jeden controller, czyli: forum_categories, forum_threads oraz forum_posts. Jednak pozostaje kwestia tego, w jaki sposób połączyć to ze sobą i jak zbudować w pełni działające forum.
Jeśli dobrze rozumiem architekturę REST, powinienem stworzyć w routerze zależności między tymi controllerami, mianowicie(piszę schematycznie):
map.resource :forum_categories do |category|
category.map :forum_threads do |thread|
thread.map :forum_posts
end
end
Czy takie powiązanie jest dobre? Czy powinienem to rozwiązać w ten sposób?
Pozdrawiam, Mateusz
Każde rozwiązanie które spełni Twoje oczekiwania jest dobre
Nie ma jednoznacznej odpowiedzi na to co jest dobre. Jeśli chcesz możesz to zrobić w zagnieżdżony sposób tak jak opisałeś. Możesz też użyć płaskiej struktury, np:
map.resources :forum_categories
map.resources :forum_threads
map.resources :forum_posts
Zaletą “płaskiej” struktury jest to, że nie musisz podczas generowania url’a (metody *_path i *_url) przekazywać za każdym razem wszystkich id (category_id, thread_id i post_id) tylko 1 id (to którego w danym przypadku potrzebujesz).
Zaletą zagnieżdżonej struktury jest np. lepsze SEO (jeśli użyjesz np. nazwy kategorii, wątków w url’ach w połączeniu z id) etc.
Najlepiej najpierw stworzyć sobie na papierze strukturę url’i jaką potrzebujesz a później dopiero zastanowić się jak zrobić to w Railsach.
Dobre jest sam tak mam, pisalem nie dawno forum od zera. Tylko wtedy w kontrolerze musisz sobie dac dodawtkowe zapytania do bazy by moc jak juz hosiawak pisal generowac urle
Ale dzial ok i spokojnie mozna to robic chodz czasem niezle combosy powstaja, unikal bym wlasnie wtedy przedrostkow forum, chodz ladne daja pozniej takie cuda
link_to ‘aaa’, forum_cate…forum_thre…forum…posts_url(@a,@b,@c), wiec troche tego jest, no ale czytelne.
Okej, teraz rozumiem.
Żeby nie zakładać nowego tematu, chciałem jeszcze zapytać o sposób zapisu komentarzy.
Przemyślałem wszystko i stworzyłem sobie jedną tabelę “comments” dla wszystkich obiektów na stronie. Schemat wygląda tak:
`comments`:
comment_text
comment_user_id (:belong_to :user)
comment_object_id ( o tym niżej )
comment_object_type ( j/w)
Teraz sprawa wygląda tak, że potrzebuję napisać obsługę komentarzy w oparciu o ten schemat. Jednak sprawa komplikuje się, ponieważ te komentarze będą dla: utworów muzycznych, teledysków, podstron, newsów i paru innych drobiazgów.
System będzie identyfikował typ komentarza po object_type( 1 - news , 2 - site , 3- teledyski, 4 - tracks), itp. object_id to ID danego obiektu.
Wszystko byłoby pięknie gdybym teraz wiedzial jak zabrać się za napisanie tego kontrolera.
Do głowy przychodzą mi dwa pomysły:
Pierwszy to albo pobrać object_id i w jakiś sposób przekazać object_type do głównego controllera comment, który będzie zarządzał całością, a w logice będzie zawierał ify które odpowiednio będą dodawać komentarze w zależności od obiektu.
Drugi, bardziej (moim zdaniem) sensowny sposób to po prostu do każdego z kontrollerów (tracks, movies, news, sites) dodać metodę (przez :members) comment, która będzie sobie tym zarządzała.