Has_many :through

Ciao a tutti,

avrei la necessita di collegare due tabella inserendo nella tabella
“join” alcune colonne attraverso le quali
poter definire meglio il tipo di collegamento e, leggendo in giro, credo
di aver capito che si possa utilizzare
has_many :through, in dettaglio ho quindi organizzato la cosa come
segue:

class Vehicle < ActiveRecord::Base
has_many :name_vehicles
has_many :names, :through => :name_vehicles
end

class Name < ActiveRecord::Base
has_many :name_vehicles
has_many :vehicles, :through => :name_vehicles
end

class NameVehicle < ActiveRecord::Base
belongs_to :name
belongs_to :vehicle
end

Nella tabella name_vehicles, oltre ai due campi name_id e vehicle_id ho
altri campi che
definiscono meglio la relazione ( tipo_relazione - inizio_relazione -
fine_relazione ) :

class CreateNameVehicles < ActiveRecord::Migration
def self.up
create_table :name_vehicles do |t|
t.integer :name_id, :null => false
t.integer :vehicle_id, :null => false
t.string :tipo_relazione
t.date :inizio_relazione
t.date :fine_relazione
end
end

inserendo un nuovo “vehicle”, riesco a collegare name_id e vehicle_id
nella tabella con:

#VIEW new vehicles
<%= f.label :names %>

<%= f.collection_select :name_ids, @names, :id, :cognome_nome, {},
:multiple => true%>

il mio problema ora è popolare i restanti campi della tabella join (
tipo_relazione - inizio_relazione - fine_relazione )
quando inserisco un nuovo veicolo.

Grazie, Renato.

In questo a caso, dovresti avere una form per creare un NameVehicle che
abbia le 2 collection select per Name e Vehicle. Ovviamente dovrai prima
creare i vari Name e Vehicle. In questo modo puoi avere tutti i campi
aggiuntivi :wink:

non so se ho centrato il tuo problema, in effetti non mi è molto chiaro
quello che stai facendo :stuck_out_tongue:
A.

Il 03/06/2010 14:48, Renato Daprà ha scritto:

Il giorno 03/giu/2010, alle ore 15.43, Andrea P. ha scritto:

In questo a caso, dovresti avere una form per creare un NameVehicle che
abbia le 2 collection select per Name e Vehicle. Ovviamente dovrai prima
creare i vari Name e Vehicle. In questo modo puoi avere tutti i campi
aggiuntivi :wink:

non so se ho centrato il tuo problema, in effetti non mi è molto chiaro
quello che stai facendo :stuck_out_tongue:
A.

Grazie Andrea, hai centrato esattamente il problema, facendo come dici
tu in effetti funziona,
però, per popolare i campi aggiuntivi della tabella di join devo prima
inserire sia “name” che “vehicle”
per poi gestire i campi aggiuntivi con le collection_select in
NameVehicle.

Il mio desiderio era era saltare un passaggio, cioè, dato per scontato
che name esista già e che all’atto della creazione di un nuovo “vehicle”,
riesco a gestirlo con “name_ids”, avrei avrei voluto gestire/popolare i
campi aggiuntivi in Vehicle new/edit .

Spero di non aver fatto troppa confusione, grazie ancora, Renato

ciao Renato,

continuo a non avere molto chiaro quello che stai facendo, almeno a
livello di associazioni :stuck_out_tongue:

ad ogni modo posso indicarti un paio di strade:

  • sei sicuro di aver bisogno di 3 modelli per gestire Nomi, Veicoli
    ed un TOT informazioni da associare? se riuscissi a scendere a 2,
    ovviamente il problema non si porrebbe :stuck_out_tongue:
  • dai uno sguardo alle NestedForms se vuoi inserire dati relativi a
    più model attraverso una sola form. nel caso in cui tu voglia inserire
    N Veicoli per ciascun Nome, ma non sai quanti, dovrai smanazzare di
    javascript per aggiungere nuove nested-forms. Un esempio calzante è
    quando vuoi creare una galleria di foto: nella form per creare una
    Gallery, aggiungi una nested-form per la Foto, poi con JS e qualche
    elemento grafico crei un meccanismo di “aggiungi foto”. quando salverai
    la galleria verranno caricate anche le N foto, tutte assieme.

ciao,
A.

Il 03/06/2010 16:54, Renato Daprà ha scritto:

Il giorno gio, 03/06/2010 alle 17.38 +0200, Andrea P. ha scritto:

ciao Renato,

continuo a non avere molto chiaro quello che stai facendo, almeno a
livello di associazioni :stuck_out_tongue:

ad ogni modo posso indicarti un paio di strade:

  • sei sicuro di aver bisogno di 3 modelli per gestire Nomi, Veicoli
    ed un TOT informazioni da associare? se riuscissi a scendere a 2,
    ovviamente il problema non si porrebbe :stuck_out_tongue:

non credo sia possibile scendere a due associazioni in quanto il
collegamento fra Nomi e Veicoli è “many to many”, più veicoli ad un
nome e viceversa

  • dai uno sguardo alle NestedForms se vuoi inserire dati relativi a
    più model attraverso una sola form. nel caso in cui tu voglia inserire
    N Veicoli per ciascun Nome, ma non sai quanti, dovrai smanazzare di
    javascript per aggiungere nuove nested-forms. Un esempio calzante è
    quando vuoi creare una galleria di foto: nella form per creare una
    Gallery, aggiungi una nested-form per la Foto, poi con JS e qualche
    elemento grafico crei un meccanismo di “aggiungi foto”. quando salverai
    la galleria verranno caricate anche le N foto, tutte assieme.

Ho dato uno sguardo a NestedForm su railscasts e mi sembra un’ottima
soluzione … ci provo …

Grazie, Renato.