Relazioni has_many :thtough

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 %>
  • <%= s.from %> - <%= s.to %>

    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.

    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.