Problem z wypisaniem danych z powiązanych ze sobą tabel!

Witam. co muszę zrobić żeby podczas wypisywania danych z tabeli Trening wypisało również dane z połączonej tabeli Place. Poniżej szczegóły bo nie umiem tego obrać w słowa :slight_smile:

index.html.erb

[code]…
<% @trenings.each do |trening| %>

<%= trening.place_id %> <--- teraz wypisuje ID Place a chciałbym żeby wypisało dane z kolumny Name z tabli Place
<td><%= trening.trening_types %></td>
<td><%= trening.trening_data %></td>
<% end %> ...[/code] [code]class TreningsController < ApplicationController def index @trenings = Trening.all end end[/code] [code]class Place < ActiveRecord::Base has_many :trenings end[/code] [code]class Trening < ActiveRecord::Base belongs_to :place accepts_nested_attributes_for :place end[/code] Z góry dziękuje za pomoc i pozdrawiam.

O takie coś Tobie chodzi?

trening.place.something

@down
Dopiero potem zauważyłem, że to odwrotna relacja. :wink:

Np.

<td><%= trening.place.name %></td>

: )

[quote=konole]O takie coś Tobie chodzi?

trening.places.each do |place| place.something end
[/quote]
Tam ta relacja jest na odwrót, jeden trening ma jedno miejsce, ale w jednym miejscu może być wiele treningów : )

PS. Pytanie “Jaki dzień tygodnia mamy dzisiaj?” o 2.30 w nocy wcale nie jest takie proste : P

jakieś inne pomysły ? :slight_smile: może coś w controlerze trzeba sie pobawić z np :jons

Ale w czym jest teraz problem?

<td><%= trening.place.name %></td>

To nie działa? A co wywala serwer?

heh no nie działa :slight_smile: takie coś pokazuje

[code]ActionView::Template::Error (undefined method name' for nil:NilClass): 15: 16: <% @trenings.each do |trening| %> 17: <tr> 18: <td><u><%= trening.place.name %> </u></td> 19: 20: 21: <td><%= trening.trening_types %></td> app/views/trenings/index.html.erb:18:in_app_views_trenings_index_html_erb___2004379695_70283122392980’
app/views/trenings/index.html.erb:16:in _app_views_trenings_index_html_erb___2004379695_70283122392980' app/controllers/trenings_controller.rb:9:inindex’

Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.9ms)
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.6ms)
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (176.1ms)[/code]

Bo pewnie trening nie posiada pola name, jak założył Świstak. Spróbuj wyświetlać id w ten sposób:

<%= trening.place.id %>

Jeśli zadziała to spójrz na nowy kod. Teraz na stary (trening.place_id). Teraz na nowy. Możesz w ten sposób odnieść się do dowolnego pola z obiektu place. I’m on a horse.

teraz wywala taki bład:

[code]Started GET “/trenings” for 127.0.0.1 at Sat Feb 25 20:25:56 +0100 2012
Processing by TreningsController#index as HTML
User Load (0.2ms) SELECT “users”.* FROM “users” WHERE “users”.“id” = ? LIMIT 1 [[“id”, 1]]
Trening Load (0.6ms) SELECT “trenings”.* FROM “trenings” WHERE “trenings”.“user_id” = 1
Rendered trenings/index.html.erb within layouts/application (36.1ms)
Completed 500 Internal Server Error in 104ms

ActionView::Template::Error (Called id for nil, which would mistakenly be 4 – if you really wanted the id of nil, use object_id):
15:
16: <% @trenings.each do |trening| %>
17:


18: <%= trening.place.id %>
19:
20:
21: <%= trening.trening_types %>
app/views/trenings/index.html.erb:18:in _app_views_trenings_index_html_erb___2004379695_70083380728140' app/views/trenings/index.html.erb:16:in_app_views_trenings_index_html_erb___2004379695_70083380728140’
app/controllers/trenings_controller.rb:9:in `index’

Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.4ms)
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.7ms)
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (15.9ms)[/code]

sorry źle zrobiłem. <%= trening.place_id %> działa i działo wcześniej. a co do istnienia pola name to istnieje. niże plik schema.rb

schema.rb

create_table "places", :force => true do |t| t.string "name" t.integer "place_favorite", :default => 0 t.integer "place_default", :default => 0 t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" end
tak teraz myśle że mogę mieć konflikt nazw. w modelu tabela nazywa sie PLACE a w pliku schema PLACES. nie wiem czemu tak się stało.

Mój błąd. Kod Świstaka był okej. Po prostu do danego treningu nie masz przypisanego miejsca. Bardzo wyraźnie mówi o tym komunikat o błędzie:

Called id for nil

Proponuję żebyś przed zajmowaniem się Railsami najpierw nauczył się programować w „czystym” Rubym. Pozwoli Ci to zrozumieć komunikaty błędów, powiązania między obiektami i wiele z „magii” Railsów.

[quote=nowohucjanin]sorry źle zrobiłem. <%= trening.place_id %> działa i działo wcześniej. a co do istnienia pola name to istnieje. niże plik schema.rb

schema.rb

create_table "places", :force => true do |t| t.string "name" t.integer "place_favorite", :default => 0 t.integer "place_default", :default => 0 t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" end
tak teraz myśle że mogę mieć konflikt nazw. w modelu tabela nazywa sie PLACE a w pliku schema PLACES. nie wiem czemu tak się stało.[/quote]
Hm, ale nic nie mieszasz w schema? Wszystkie operacje na bazie danych powinny być w db/migrations. O migracjach info tutaj: http://guides.rubyonrails.org/migrations.html A http://guides.rubyonrails.org to w ogóle bardzo dobry i całkiem szeroki tutorial : )

nic nie mieszam w schema. chciałem tylko pokazać ze to nie bład braku komórki name tylko jakiś inny. zastanawiam się tylko od czego zależy dodanie przez railsy końcówki “s” do nazwy modelu przy tworzeniu rusztowania.

Taka konwencja. “Convention over Configuration” i te sprawy :wink:

model: Article
tabela: articles
kontroler: ArticlesController
foreign key: article_id
itd.

Jak nie wiesz takich rzeczy, to serio zacznij od tego co wrzucił swistak35 - http://guides.rubyonrails.org/. Będzie Ci łatwiej niż działać metodą prób i błędów nie wiedząc co, jak i dlaczego tak. :wink:

No i nie trenings a trainings :smiley:

W bazie ma tabelę trenings… Lepiej już się konsekwentnie trzymać tego potworka.