[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