Relacja wiele-do-wielu w widoku

Hej,

Na wstepie witam wszystkich, bo to moj pierwszy post na forum. Niestety, jako ze jestem poczatkujacy, przychodzi mi od razu prosic o pomoc - moze ktos znajdzie chwile i zechce poddzielic sie doswiadczeniem.

Mam w tej chwili nastepujaca relacje (nazwy encji zmienione dla uproszczenia):
Samochod <-n----m-> Opcje wyposazenia

Tworzac nowy produkt, lub edytujac juz istniejacy, chcialbym dac uzytkownikowi mozliwosc obslugi na takim formularzu jak przyklad to-do-list, czyli

Samochod - Edycja
Nazwa: [ ]
Opcje
Elektryczne szyby [ Usun ] [ Edytuj ]
Podgrzewane lusterka [ Usun ] [ Edytuj ]
[ Dodaj opcje ]

mam nadzieje, ze widac, o co chodzi - ta lista jest dynamiczna. Nie byloby problemu z wywolaniem typu:

<%= link_to_remote “Usuń” ,
:url => {:action => ‘destroy_option’, :id => option.id },
:update => ‘options_wrapper’ %>

gdyby to byl istniejacy obiekt samochodu - wowczas wszystkie te opcje bylby automatycznie zapisywane w bazie danych. Zalezy mi jednak na tym, zeby ta funkcjonalnosc dzialala tez, gdy instancja Samochod nie zostala jeszcze zapisana w bazie danych i nie ma ID.

Zapewne trzeba to jakos cacheowac, gdyby to byl PHP, uzylbym sesji, ale w ROR nie jestem pewien, czy nie bede wymyslal kola - jesli ktokolwiek ma jakas koncepcje, jak mozna rozwiazac taki temat, bede bardzo wdzieczny za pomoc.

Pozdrawiam

Cały problem bierze się stąd, że brakuje Ci środkowego modelu. W nowoczesnej aplikacji Rails każda tabela powinna mieć swój model. Wyjaśnienie:
Dlaczego unikamy wiele-do-wielu?
Rails - 10 przykazań

Wielkie dzieki za odpowiedz, Qertoip! Czytalem juz gdzies to zalecenie dot. HABTM - ponoc w przyszlych wersjach w ogole ma byc przestarzale. Ale - moze czegos nie kumam - nie za bardzo wiem, jak mi to ma pomoc :slight_smile:

Zeby jakos zwiazac te dane dotyczace Opcji z encja glowna, Samochodem - czy tabela zlaczenia bedzie miala klucz glowny, czy nie - potrzebuje ja przypiac do formularza. A to dlatego, ze encja glowna, jeszcze nie istnieje w bazie danych i nie ma ID. A formularz, w przeciwienstwie do formularza Struts, jest - jak mi sie zdaje - w ROR obiektem krotkotrwalym, ktory istnieje tylko podczas obslugi żądania i zaraz potem znika (nie ma go pomiedzy żądaniami) i tego dotyczyl moj post - do czego moge przypiac ta informacje, tak, zeby zostala miedzy żądaniami. Moglbym Cie zatem prosic o dokladniejsze wytlumaczenie jak to widzisz?

Masz rację, że samo stworzenie dodatkowego modelu nie rozwiązuje problemu. A jest to ciekawy problem.

Nie wydaje mi się, żeby Rails oferowało tu jakieś złote rozwiązanie prosto z pudełka. Po zastanowieniu, najbardziej naturalne wydaje mi się rozwiązanie, które na początku wygląda podejrzanie.

Proponuję zapisywać obiekty środkowej tabeli z pustym kluczem obcym do samochodu. Identyfikatory tych obiektów będą trzymane (oczywiście) w sesji. IMHO najlepiej wpisuje się to w całokształt Rails. Pozwala pozostać przy standardowych REST-kontrolerach.

Jedyne, co trzeba tutaj uwzględnić, to okresowe czyszczenie nieaktualnych (np. starszych niż dzień) wpisów, ale to jest trywialne.

(Dlaczego nie wrzucać wszystkiego do sesji? Obiekty nie powinny być trzymane w sesji ze względu na problemy przy wdrażaniu kolejnych iteracji - no chyba, że możesz sobie pozwolić na resety sesji. Więcej we wspomnianych “10 przykazaniach”).

Na marginesie, zamiast::url => {:action => 'destroy_option', :id => option.id }
powinno być:

:url => option_url( option ), :method => :delete

(przy założeniu, że Twój środkowy model nazywa się Option)