# Relazioni has\_many :thtough

**URL:** <https://www.ruby-forum.com/t/relazioni-has-many-thtough/226008>\
**Category:** IT\
**Created:** [May 15, 2008, 12:15pm UTC](https://www.ruby-forum.com/t/relazioni-has-many-thtough/226008 "2008-05-15T12:15:47Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![catiana](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/8e7dd6/32.png) [@catiana](https://www.ruby-forum.com/u/catiana)\
**Post date:** [May 15, 2008, 12:15pm UTC](https://www.ruby-forum.com/t/relazioni-has-many-thtough/226008/1 "2008-05-15T12:15:47Z")

</div>

Ciao a tutti,  
sono nuova al mondo rails.  
Avrei bisogno di alcune delucidazioni in merito all’associazione  
has\_many :through!

Ammettiamo di avere:

models:

class Ship \< ActiveRecord::Base  
has\_many :ways  
has\_many :sections, :through=\>:ways  
end

class Section \< ActiveRecord::Base  
has\_many :ways  
has\_many :ships, :through=\>:ways  
end

class Way \< ActiveRecord::Base  
belongs\_to :section  
belongs\_to :ship  
end

Nella vista relativa all’inserimento di una nuova nave voglio poter  
scegliere quale tratta deve fare e definire altre informazoni  
aggiuntive.

ships/new.html.erb

\<% form\_tag :action=\>“create” do %\>  
…

 \<% for s in @sections %\> - **Start date**   
 \<%= text\_field "way" + s.id.to\_s, "start\_date" %\> 

 \<%end%\> 
... \<%end%\>

A questo punto nel controller, ShipController, per permettere la  
creazione della nave definisco il metodo create cosÃ¬:

def create  
@ways = Array.new  
@ship = Ship.new(params[:ship])  
@sections = Section.find(:all)  
@ship.gate\_id = Gate.find(params[:gate\_id]).id if params[:gate\_id]  
@ship.save  
for i in 0…params[:section\_ids].length-1  
@section = Section.find(params[:section\_ids][i])  
@ways[i] = Way.new(params[“way” + @section.id.to\_s])  
@ways[i].section\_id = @section.id  
@ways[i].ship\_id = @ship.id  
@ways[i].save  
end  
@ship.sections = @ways

```
if @ship.save
  ...
else
  ...
end

```

end

L’inserimento nel DB avviene in maniera corretta.  
Ora la mia richiesta Ã¨: se voglio fare delle modifiche per una ragione  
X, come dovrei creare la pagina edit.html e come devo specificare il  
metodo update?  
Io ho iniziato con una bozza:

\<% for s in @sections %\>

-   
\<input type=“checkbox” name=“section\_ids[]” id="\<%= s.id %\>"  
value="\<%= s.id %\>" \<% if @ship.sections.include? s then %\>  
checked=“checked”  
\<%end%\> \>  
\<%= s.from %\> - \<%= s.to %\>  
\<% if @ship.sections.include? s then %\>  
\<%for w in @ways %\>  
\<% if w.ship.id == @ship.id and w.section\_id == s.id then %\>  
\<% @way = w %\>  

**Start date**   
  
\<%= text\_field :way,:start\_date %\>

  
…  
\<%end%\>  
\<%end%\>  
\<%else%\>  
\<% @way = nil %\> 

**Start date**   
 \<%= text\_field :way,:start\_date %\>

 ... \<%end%\> 
 \<%end%\>

il metodo update sarebbe questo:

def update  
@ship = Ship.find(params[:id])  
@sections = Section.find(:all)  
@ship.gate\_id = Gate.find(params[:gate\_id]).id if params[:gate\_id]  
@ways = Way.find(:all, :conditions=\>[“ship\_id=?”,params[:id]])  
@ship.update\_attributes(params[:ship])  
#cancello i tragitti con l’id della nave specificato  
for way in @ways  
Way.delete\_all([“ship\_id=?”, @ship.id])  
end  
for i in 0…params[:section\_ids].length-1  
@section = Section.find(params[:section\_ids][i])  
puts params[:way]  
#puts params[:way][:@section.id]  
@ways[i] = Way.new(params[:way])  
@ways[i].section\_id = @section.id  
@ways[i].ship\_id = @ship.id  
@ways[i].save  
end  
@ship.sections = @ways

```
if @ship.update_attributes(params[:ship])
  ...
else
  ...
end

```

end

Ovviamente nn funziona, ma mi rendo conto che il mio problema Ã¨ legato  
all’inesperienza.

Qualcuno puÃ² aiutarmi.

Grazie mille a tutti anticipatamente.

---

<div class="post-metadata">

**Author:** ![catiana](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/8e7dd6/32.png) [@catiana](https://www.ruby-forum.com/u/catiana)\
**Post date:** [May 16, 2008, 11:11am UTC](https://www.ruby-forum.com/t/relazioni-has-many-thtough/226008/2 "2008-05-16T11:11:08Z")

</div>

Ciao a tutti,  
scusatemi se ho scritto molto in precedenza, comumque sono qui a dirvi  
che ho risolto il problema.

Vi mostro come l’ho risolto:

edit.html.erb

\<% for s in @sections %\>

-   
\<input type=“checkbox” name=“section\_ids[]” id="\<%= s.id %\>"  
value="\<%= s.id %\>" \<% if @ship.sections.include? s then %\>  
checked=“checked”  
\<%end%\> \>  
\<%= s.from %\> - \<%= s.to %\>  
\<% if @ship.sections.include? s then %\>  
\<%for w in @ways %\>  
\<% if w.ship.id == @ship.id and w.section\_id == s.id then %\>  
\<% @way = w %\>  

**Start date**   
  
\<%= text\_field “way”, “start\_date”, “index” =\> s.id%\>

  
…  
\<%end%\>  
\<%end%\>  
\<%else%\>  
\<% @way = nil %\>  

**Start date**   
  
\<%= text\_field “way”, “start\_date”, “index” =\> s.id%\>

  
…  
\<%end%\>  
  
\<%end%\>

mentre il metodo update del controller ships\_controller.rb:

def update  
@ship = Ship.find(params[:id])  
@sections = Section.find(:all)  
@ship.gate\_id = Gate.find(params[:gate\_id]).id if params[:gate\_id]  
@ways = Way.find(:all, :conditions=\>[“ship\_id=?”,params[:id]])  
@ship.update\_attributes(params[:ship])  
#cancello i tragitti con l’id della nave specificato  
for way in @ways  
Way.delete\_all([“ship\_id=?”, @ship.id])  
end  
for i in 0…params[:section\_ids].length-1  
@section = Section.find(params[:section\_ids][i])  
@ways[i] = Way.new(params[:way][@section.id.to\_s])  
@ways[i].section\_id = @section.id  
@ways[i].ship\_id = @ship.id  
@ways[i].save  
end  
@ship.sections = @ways

```
if @ship.update_attributes(params[:ship])
  ...
else
  ...
end

```

end

Magari sarÃ una soluzione parziale e non definitiva (sempre da  
perfezionare con l’esperienza).

Grazie a tutti, comunque!

Ciao ciao.
