[ruby-it] has_and_belongs_to_many come riempire la join table?

Mauro mrsanna1 a gmail.com
Gio 5 Feb 2009 13:24:09 CET


2009/2/5 Pietro Giorgianni <giorgian a gmail.com>:
> 2009/2/4 Mauro <mrsanna1 a gmail.com>:
>> Pero' mi serve qualcosa di piu':
>> Le categorie fanno parte di diversi settori, cioe' ho un'associazione
>> uno a molti tra settori e categorie.
>> Quando inserisco un nuovo fornitore percio', non voglio assegnarli la
>> categoria di appartenenza scegliendo tra tutte le categorie
>> disponibili, bensi' vorrei prima indicare il settore per poi scegliere
>> tra le categorie appartenenti al settore selezionato.
>
> chiarissimo.
>
> nella mia applicazione ho incontrato questo problema più volte.
>
> in un caso, poiché le opzioni possibili erano veramente tante, ho fatto così:
>
> una normale select "settore", poi un observe_field che, quando scatta,
> fa una richiesta ajax a un apposito metodo di un controller, che
> restituisce la select con le sole categorie per quel settore.
>
> relativamente veloce da scrivere, però, ripeto, consigliabile solo se
> il numero di settori e/o categorie è molto molto alto, perché la
> richiesta ajax ci impiega un po'.
>
> in un altro caso, le opzioni possibili erano pochi, ho usato
> javascript (in una view: era un file .js.erb):
>
> var sections = new Array();
> <%- for section in @sections -%>
>  elem = document.createElement('optgroup');
>  elem.setAttribute('id', '<%= "group#{section.id}" -%>');
>  elem.appendChild(create_option('', '<%= t(:option_pick_a_user) -%>'));
>  <% for user in section.users -%>
>    elem.appendChild(create_option('<%= user.id -%>', '<%= user.nick -%>'));
>  <% end -%>
>  sections['<%= section.id -%>'] = elem;
> <% end -%>
>
> function create_option(value, text) {
>  o = document.createElement('option');
>  o.setAttribute('value', value);
>  o.appendChild(document.createTextNode(text));
>  return o;
> }
>
> function set_users() {
>  section = $('assignment_section_id').value;
>  if (section == "") {
>    $('users').hide();
>    $('buttons').hide();
>  }
>  else {
>    sel = $('assignment_user_id');
>    children = sel.childNodes;
>    for(i = 0; i < children.length; i++)
>      sel.removeChild(children[i]);
>    sel.appendChild(sections[section]);
>    $('users').show();
>    $('buttons').show();
>  }
> }
>
> come vedi, ho popolato un array javascript, e poi nella view uso:
>
> <%= observe_field "id_della_select", :function => "set_users()" %>
>
>
> forse è possibile creare gli optgroup direttamente da codice erb,
> senza usare javascript, crearli tutti invisibili e poi mostrare quello
> giusto, ma non ne sono sicuro.

Ah ecco, piu' complicato del previsto, agli observe non ci sono ancora
arrivato :-)


More information about the Ml mailing list