[ruby-it] has_and_belongs_to_many come riempire la join table?
Pietro Giorgianni
giorgian a gmail.com
Gio 5 Feb 2009 13:12:16 CET
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.
More information about the Ml
mailing list