Problema con le relation

Salve ragazzi,

Ho 2 modelli (con relativi controller e viste) chiamati EVENTS e LINKS.

Ogni events has_many :links
Ogni links belongs_to :event

Questo è lo schema di questi due modelli:

create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.string “event_id”
end

create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end

Nella pagina SHOW della vista EVENTS vorrei mostrare tutti i link
relativi a ogni event.

Nel file routes ho scritto

resources :events do
resources :links
end

E nella pagina show della vista events ho scritto:

    <% @event.links.each do |link| %>
  • <%= link.url %>
  • <% end %>

Solo che non funziona :frowning: Cosa sto sbagliando?

event_id dev essere di tipo integer, non string

2012/5/7 Mauro M. [email protected]

Anzi tutto grazie per la risposta :slight_smile:

Ho modificato lo schema ed ora è cosi:

create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “link_id”
end

create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end

Ma continua a non funzionare :frowning:

Sto avendo un sacco di problemi con le relation :frowning:

Niente non va :frowning:

Il mio schema è esattamente questo ora:

create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end

create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end

Non è che c’è qualche errore qua:

    <% @event.links.each do |link| %>
  • <%= link.url %>
  • <% end %>

?

E’ la stessa cosa se faccio cosi:

    <% for link in @event.links %>
  • <%= link.url %>
  • <% end %>

Oppure forse ho sbagliato qualcosa nel file routes?

Peps::Application.routes.draw do

resources :events do
resources :links
end

resources :links

resources :events

end

elimina la colonna link_id dalla tabella events.

create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end

create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end

ma che tipo di errore hai? Perch a prima vista sembra tutto ok. Riesci a
fornire qualche dettaglio in pi dal log?

Se può essere utile ho provato dalla console a fare cosi:

1.9.2p318 :014 > @event=Event.find(1)
Event Load (0.2ms) SELECT “events”.* FROM “events” WHERE
“events”.“id” = ? LIMIT 1 [[“id”, 1]]
=> #<Event id: 1, title: “Germinazione”, note: “Sono germinati i primi
habanero”, created_at: “2012-05-06 22:11:36”, updated_at: “2012-05-06
22:11:36”>

1.9.2p318 :015 > @event.links
Link Load (0.2ms) SELECT “links”.* FROM “links” WHERE
“links”.“event_id” = 1
=> []

la query che genera errata. nei model hai definito la relazione?
in Event devi definire
has_many :links, :class_name => ‘Link’

in Link devi definire
belongs_to :event, :class_name => ‘Event’, :foreign_key => :event_id

2012/5/7 Mauro M. [email protected]

Alessandro R. wrote in post #1059828:

ma che tipo di errore hai? Perch a prima vista sembra tutto ok. Riesci a
fornire qualche dettaglio in pi dal log?

Non ho nessun errore! Guarda il log:

Started GET “/links/1” for 127.0.0.1 at 2012-05-07 12:50:26 +0200
Processing by LinksController#show as HTML
Parameters: {“id”=>“1”}
[1m[36mLink Load (0.2ms)[0m [1mSELECT “links”.* FROM “links” WHERE
“links”.“id” = ? LIMIT 1[0m [[“id”, “1”]]
Rendered links/show.html.erb within layouts/application (1.7ms)
Completed 200 OK in 10ms (Views: 8.6ms | ActiveRecord: 0.2ms)

Il problema è che non mi mostra, nella vista show degli eventi, i link
relativi.

Il codice

    <% @event.links.each do |link| %>
  • <%= link.url %>
  • <% end %>

Stampa nella pagina html solo

    Non vengono stampati i link…

    Adesso la query che genera corretta. Sembra che non ci siano record
    nella
    tabella links :slight_smile:
    Se esegui gli stessi due comandi di prima da terminale?

    Alessandro R. wrote in post #1059837:

    la query che genera errata. nei model hai definito la relazione?
    in Event devi definire
    has_many :links, :class_name => ‘Link’

    in Link devi definire
    belongs_to :event, :class_name => ‘Event’, :foreign_key => :event_id

    2012/5/7 Mauro M. [email protected]

    Non avevo impostato la foreign_key nel modello…

    Anche mettendola però non funziona, i link non vengono mostrati.

    La query che esegue ora è questa:

    Started GET “/events/1” for 127.0.0.1 at 2012-05-07 14:54:51 +0200
    Processing by EventsController#show as HTML
    Parameters: {“id”=>“1”}
    Event Load (0.3ms) SELECT “events”.* FROM “events” WHERE
    “events”.“id” = ? LIMIT 1 [[“id”, “1”]]
    Link Load (0.1ms) SELECT “links”.* FROM “links” WHERE
    “links”.“event_id” = 1
    Rendered events/show.html.erb within layouts/application (54.5ms)
    Completed 200 OK in 132ms (Views: 80.1ms | ActiveRecord: 5.6ms)

    Puoi vedere il codice qua
    https://bitbucket.org/gagginaspinnata/problema-relazioni/src

    Grazie mille per la disponibilità

    Alessandro R. wrote in post #1059853:

    Adesso la query che genera corretta. Sembra che non ci siano record
    nella
    tabella links :slight_smile:
    Se esegui gli stessi due comandi di prima da terminale?

    I links ci sono perchè se vado a vedere la pagina index della vista
    links (che ho creato) vengono mostrati :frowning:

    Questo il risultato di quei comandi: 1.9.2p318 :001 >
    @event=Event.find(1)
    Event Load (4.2ms) SELECT “events”.* FROM “events” WHERE
    “events”.“id” = ? LIMIT 1 [[“id”, 1]]
    => #<Event id: 1, title: “Germinazione”, note: “Sono germinati i primi
    habanero”, created_at: “2012-05-06 22:11:36”, updated_at: “2012-05-06
    22:11:36”>
    1.9.2p318 :002 > @event.links
    Link Load (0.1ms) SELECT “links”.* FROM “links” WHERE
    “links”.“event_id” = 1
    => []
    1.9.2p318 :003 >

    Esatto! L’ultimo comando ti dice chiarimente che non hai impostato
    event id
    Il giorno 07/mag/2012 17.29, “Luca M.”
    [email protected]
    ha scritto:

    2012/5/7 Mauro M. [email protected]

    I links ci sono perch se vado a vedere la pagina index della vista
    links (che ho creato) vengono mostrati :frowning:

    ma i links hanno il giusto event_id ? Ho l’impressione che tu li abbia
    creati senza collegarli all’Event …

    Luca

    dipende da cosa c’ scritto nel controller

    2012/5/7 Mauro M. [email protected]

    Ok ho risolto cosi nel controller:

    @link.event_id= params[:event_id]

    A dir la verità pensavo che rails lo facesse in automatico :slight_smile:

    Grazie mille e scusa per le mille domande :frowning:

    si, infatti dovrebbe farlo in automatico senza bisogno di quella
    chiamata.

    Avete ragione inserendo un link tramite console e specificando l’id
    relativo funziona.

    Ma utilizzando il codice

    <%= form_for([@event, @event.links.build]) do |f| %>

    <%= f.text_field :url %>

    <%= f.submit "Aggiungi link" %>

    <% end %>

    Non dovrebbe passarlo automaticamente l’id dell’evento?

    Il 08/05/12 11:09, Mauro M. ha scritto:

    Ok ho risolto cosi nel controller:

    @link.event_id= params[:event_id]

    A dir la verit pensavo che rails lo facesse in automatico :slight_smile:

    Grazie mille e scusa per le mille domande :frowning:

    Fossi in te non passerei direttamente l’id, altrimenti puoi metterci un
    numero a caso (a meno di validazioni).

    farei cos:

    event = Event.find(params[:event_id])
    @link.events << event if event