[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