Bardzo dynamiczne języki a create & update

Mam model “News”. Uzytkownik ma mozliwosc dodawania newsa w dowolnej liczbie definiowanych przez niego jezykow. Przykladowa sytuacja moze wygladac tak:

  1. uzytkownik ustawia w panelu jako aktywne jezyki polski i angielski
  2. dodaje newsa i w formularzu ma pola dla tytulu i tresci po polsku i angielsku
  3. uzytkownik dodaje nowy jezyk - niemiecki
    4a) dodaje nowego newsa w 3 jezykach
    4b) moze edytowac stworzonego na poczatku newsa w 3 jezykach
    Nie chce miec w tabeli news miliona kolumn typy title_pl , title_en, content_pl, content_en itp bo uzytkownik moze dodawac ile tylko chce jezykow wiec jak doda 20 to mam 40 dodatkowych kolumn w tabeli. Postanowilem wiec wpakowac to do osobnej tabeli “contents” ktora ma taka strukture:
  • id
  • model ( poza newsami sa tez inne modele o tej samej funkcjonalnosci, tak wiec ta kolumna przyjmuje wartosci np “News” )
  • model_id ( id rekordu w danym modelu - czyli przypisanie )
  • lang ( jezyk w jakim zapisana jest tresc w rekordzie )
  • part ( wartosci ‘t’ lub ‘c’ czyli title lub content )
  • content ( tresc )

w moim modelu dodalem

has_many :titles, :class_name => "Content", :conditions => ['part = ?','t'] has_many :contents, :conditions => ['AND part = ?','c']
problem teraz jest taki: jak to wszystko zapisac w kontrolerze i widoku przy zapisywaniu i aktualizowaniu.
Sytuacja wyglada tak ze jak ktos dodaje newsa to przy zapisywaniu newsa w 2 jezykach ( pl, en ) musi zostac zapisany sam news, tytul po polsku i angielsku ( 2 osobne rekordy ) i tresc po polsku i angielsku ( 2 osobne rekordy ).
Natomiast gdy news jest aktualizowany trzeba wziasc pod uwage 2 przypadki:

  1. w miedzy czasie uzytkownik nie dodal zadnych nowych jezykow - czyli przy aktualizowaniu newsa trzeba jedynie zaktualizowac istniejace rekordy tytulow i tresci newsa
  2. uzytkownik dodal nowy jezyk wiec niektore rekordy tytulow i tresci trzeba zaktualizowac a inne dopiero stworzyc.

Mam nadzieje ze opisalem to w miare jasno. Fajnie jakby udalo sie to rozwiazac jakos tak zeby dzialala rowniez walidacja bez problemu.

Drobna sugestia, która może nieco uprości sprawę - najlepiej w tej tabeli z treścią trzymać w jednym rekordzie zarówno tytuł jak i treść, w osobnych kolumnach (a nie w dwóch rekordach z “polem typu” t/c). O ile dobrze rozumiem, to treść zawsze posiada jakiś tytuł.

Nie prościej użyć Globalize?

Ok, globalize jest fajny bo moge sobie przetlumaczyc strone ( co nie jest mi potrzebne bo mam juz to zrobione ) i dane w modelu ( to mnie interesuje ) ale czy bede mogl zrobic tak:

  1. robie moj model

class News < ActiveRecord::Base translates :title, :content end
2) uzytkownik w systemie wybiera ze chce miec strone w 2 jezykach ( pl , en )
3) jak dodaje lub edytuje newsa to bedzie mogl rownoczesnie ( w jednym formularzu ) dodac go w tych 2 wersjach jezykowych ?
4) czy jak potem doda kolejny jezyk bedzie mogl je edytowac i dodawac bez problemu w wiekszej ilosci jezykow ?
prawde mowiac po przeczytaniu dokumentacji i tego co jest tutaj nie mam pomyslu jak to zakodowac.

[quote=Nookie]Ok, globalize jest fajny bo moge sobie przetlumaczyc strone ( co nie jest mi potrzebne bo mam juz to zrobione ) i dane w modelu ( to mnie interesuje ) ale czy bede mogl zrobic tak:

  1. robie moj model

class News < ActiveRecord::Base translates :title, :content end
2) uzytkownik w systemie wybiera ze chce miec strone w 2 jezykach ( pl , en )
3) jak dodaje lub edytuje newsa to bedzie mogl rownoczesnie ( w jednym formularzu ) dodac go w tych 2 wersjach jezykowych ?
4) czy jak potem doda kolejny jezyk bedzie mogl je edytowac i dodawac bez problemu w wiekszej ilosci jezykow ?.[/quote]
Zaden problem. Globalize zawsze pracuje w kontekscie jednego, biezacego jezyka. Wysylasz dane w params do kontrolera. Ten wyciaga polskie dane, ustawiasz Locale.set “pl”, zapisujesz. Przestawiasz biezacy jezyk na en (Locale.set “en”) i zapisujesz czesc angielska.

Tak jak Jarek napisał, albo wchodzisz we flaki Globalize i ręcznie wrzucasz wszystko do tabeli z translacjami, jeśli nie chce Ci się żonglować ustawieniem Locale. Możliwości są miliardy. A od strony “inżynierynej” globalize oferuje chyba najlepsze rozwiązanie do przedstawionego przez Ciebie problemu.