[ruby-it] Models multipli in un form
Paola Andriani
nuvola a elbalink.it
Mar 2 Mar 2010 12:16:46 CET
Riprovo a rifare tutto il percorso:
Allora ho tre tabelle People, Lands e Administrations (in realtà ho
sbagliato a scrivere e l'ho chiamata Amministrations, ma pazienza). Le
prime due hanno una relazione molti a molti, una
persona può amministrare più territori, un territorio può essere
amministrato nel tempo da più persone. Ed ecco quindi la ragione di
esistere della tabella Administrations.
Ed ecco le 3 tabelle con i riferimenti alle chiavi esterne.
class CreatePeople < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.string :nome
t.string :famiglia
t.string :patronimico
t.string :variazione_nome
t.string :sesso
t.timestamps
end
end
def self.down
drop_table :people
end
end
class CreateLands < ActiveRecord::Migration
def self.up
create_table :lands do |t|
t.string :denominazione
t.string :variazione_nome
t.string :articolazione_territoriale
t.text :descrizione
t.timestamps
end
end
def self.down
drop_table :lands
end
end
class CreateAmministrations < ActiveRecord::Migration
def self.up
create_table :amministrations do |t|
t.integer :person_id, :null => false, :options =>
"CONSTRAINT fk_amministration_people REFERENCES people(id)"
t.integer :land_id, :null => false, :options =>
"CONSTRAINT fk_amministration_lands REFERENCES lands(id)"
t.string :inizio_amministrazione
t.string :fine_amministrazione
t.string :carica
t.timestamps
end
end
def self.down
drop_table :amministrations
end
end
Ho impostato le relazioni has_many e belongs_to
class Amministration < ActiveRecord::Base
belongs_to :person
belongs_to :land
end
class Land < ActiveRecord::Base
has_many :amministrations
has_many :people, :through => :amministrations
accepts_nested_attributes_for :people
accepts_nested_attributes_for :amministrations
end
class Person < ActiveRecord::Base
has_many :amministrations
has_many :lands, :through => :amministrations
accepts_nested_attributes_for :lands
accepts_nested_attributes_for :amministrations
end
Dopodichè vorrei in un unico form impostare una nuova persona e dire
anche che carica ha in un determinato territorio, quindi il form deve
completare la tabella People, recuperare l'elenco e gli id dei territori
già inseriti e completare la tabella Administrations con una data di
inizio amm, una data di fine amm, una carica (conte marchese o
quant'altro) e l'accoppiata id del territorio e id della persona.
Il form l'ho fatto così:
<h1>New person</h1>
<% form_for(@person) do |f| %>
<%= f.error_messages %>
<fieldset>
<legend>Dati anagrafici</legend>
<p>
<%= f.label :nome %><br />
<%= f.text_field :nome %>
</p>
<p>
<%= f.label :famiglia %><br />
<%= f.text_field :famiglia %>
</p>
<p>
<%= f.label :patronimico %><br />
<%= f.text_field :patronimico %>
</p>
<p>
<%= f.label :variazione_nome %><br />
<%= f.text_field :variazione_nome %>
</p>
<p>
<%= f.label :sesso %><br />
<%= f.text_field :sesso %>
</p>
</fieldset>
<fieldset>
<legend>Territorio di competenza</legend>
<% f.fields_for :amministration do |builder| %>
<p>
<%= builder.label :land_id %><br />
<%= builder.collection_select(:amministration, :land_id, @lands, :id,
{:prompt => "select territorio"}) %>
</p>
<p>
<%= builder.label :carica %><br />
<%= builder.text_field :carica %>
</p>
<p>
<%= builder.label :carica %><br />
<%= builder.text_field :carica %>
</p>
<p>
<%= builder.label :inizio_amministrazione %><br />
<%= builder.text_field :inizio_amministrazione %>
</p>
<p>
<%= builder.label :fine_amministrazione %><br />
<%= builder.text_field :fine_amministrazione %>
</p>
<% end %>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
<%= link_to 'Back', people_path %>
In tutto questo non ho ancora capito come passargli l'id della persone o
se gli viene passata in automatico.
Per @lands in questa parte del form
<%= builder.label :land_id %><br />
<%= builder.collection_select(:amministration, :land_id, @lands, :id,
{:prompt => "select territorio"}) %>
</p>
ho messo nel people_controller
def index
@people = Person.all
@lands = Land.all :order => :denominazione
ma non so se vada bene o meno.
Inoltre mi sembra di aver capito di dover aggiungere un
def new
@person = Person.new
@amministration = Amministration.new
def edit
@person = Person.find(params[:id])
@amministration = Amministration.new(params[:amministration])
idem al def create, al def update e non so al def destroy.
Fatto tutto ciò mi da errore "undefined method `map' for
:land_id:Symbol"
Come ne esco? Dove ho sbagliato?
--
Posted via http://www.ruby-forum.com/.
More information about the Ml
mailing list