Pytanie dt. powiazania klas

Witam,

robie moj pierwszy programw RoR.
Strona z zalozeniem uzytkownikow. Uzytkownik dodaje swoje zawody, a do zawodow dodaje swoje starty.
Zrobilam tak: zawody maja w sobie user_id, a start ma zawody_id
Czyli user -> has many zawody, zawody belongs_to user, zawody has_many starts, start belongs_to zawody.
Czy wedlug was to jest poprawnie?
I co dalej… czy to jest poprawee:
current_user.zawody.starts…
i jak zrobic resources?
czy tak?
resources :users
resources :zawody do
resources :starty
end

??
dzieki za odpowiedz

  1. Jak możesz to używaj

    code

do pisania kodu, tak jest bardziej przejrzyście.

  1. nie mieszaj w kodzie nazw polskich i angielskich, okropnie to wygląda

  2. a teraz konkretniej:

    current_user.zawody

    => []

dostajesz tablice, więc musisz wywoałać konkretny element tablicy i dopiero na nim możesz wywołać starts itd.

  1. o co tobie chodzi z resources ?

Poza nazewnictwem, pewna decyzja jest to, czy:

  • user ‘ma’ zawody bezposrednio
  • czy tez bardziej bezposrednio ‘ma’ starty, a ‘zawody’ powiazane sa posrednio poprzez starty

Bo w praktyce dziala to tak, ze zapisujesz sie na impreze i np. biegniesz, i ‘start’ jest podstawa relacji. Chyba :wink:

Wowczas

user has_many :starts
user has_many :events, :through, :starts

start belongs_to :event
start belongs_to :user

event has_many :starts

I wowczas ‘start’ staje sie lacznikiem w relacji ‘many-to-many’ miedzy uzytkownikami a imprezami; łącznikiem ktory jest osobnym bytem z wlasnymi parametrami (wynik, samopoczucie, HR max itp) :wink:

1 Like

Dzieki za Wasze odpowiedzi i wskazowki.
Mark, dobrze mi to wytlumaczyles.
Zaczne to pisac jeszcze raz i odezwe sie jesli znowu bede miec problem.

Mark,

zakładam, ze zawodniczka może mieć kilka startow na jednych zawodach, ale każdy start jest w innej kategorii.
a jak bym chciała teraz mając id_zawodniczki wyświetlić jej wszystkie starty w jednej kategorii?
czy to będzie
zawodniczka.starts (i tu warunek ze kategoria = kategoria1) ?

Pozdrawiam
Kasia

zgadza sie - czyli majac kategorie:

2.1.2 :023 > Category.all.as_json
Category Load (0.5ms)  SELECT "categories".* FROM "categories"
=> [{"id"=>1, "name"=>"Category 1", "created_at"=>Tue, 03 Jun 2014 06:09:55 UTC +00:00, "updated_at"=>Tue, 03 Jun 2014 06:09:55 UTC +00:00}, {"id"=>2, "name"=>"Category 2", "created_at"=>Tue, 03 Jun 2014 06:09:57 UTC +00:00, "updated_at"=>Tue, 03 Jun 2014 06:09:57 UTC +00:00}] 

i usera ze startem w kategorii nr 1 ( i evencie nr 1):

User.first.starts.as_json
User Load (0.4ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
Start Load (0.2ms)  SELECT "starts".* FROM "starts" WHERE "starts"."user_id" = ?  [["user_id", 1]]
 => [{"id"=>1, "name"=>"Start #1", "user_id"=>1, "event_id"=>1, "category_id"=>2, "created_at"=>Tue, 03 Jun 2014 06:09:37 UTC +00:00, "updated_at"=>Tue, 03 Jun 2014 06:10:12 UTC +00:00}]

Starty user w kategorii nr 1 (nie ma):

2.1.2 :030 > User.first.starts.where(category: Category.find(1)).as_json
User Load (0.3ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
Category Load (0.2ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = ? LIMIT 1  [["id", 1]]
Start Load (0.2ms)  SELECT "starts".* FROM "starts" WHERE "starts"."user_id" = ? AND "starts"."category_id" = 1  [["user_id", 1]]
=> [] 

i kategoria nr 2:

 2.1.2 :031 > User.first.starts.where(category: Category.find(2)).as_json
 User Load (0.3ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
 Category Load (0.2ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = ? LIMIT 1  [["id", 2]]
 Start Load (0.3ms)  SELECT "starts".* FROM "starts" WHERE "starts"."user_id" = ? AND "starts"."category_id" = 2  [["user_id", 1]]
=> [{"id"=>1, "name"=>"Start #1", "user_id"=>1, "event_id"=>1, "category_id"=>2, "created_at"=>Tue, 03 Jun 2014 06:09:37 UTC +00:00, "updated_at"=>Tue, 03 Jun 2014 06:10:12 UTC +00:00}] 

pozdrawiam
Marek

Mark,

a teraz kolejne pytanie,
wiec mam model:
users (czyli zawodniczka, bo chce mieć tez logowanie)
events
starts

mam wiec tez kontrolery
users_controller.rb
events_controller.rb
starts_controller.rb

chce dodawać userow, każdy z userow dodaje sobie swoje eventy i swoje starty do tych eventow i teraz jakie zrobić resources?

czy takie:?
resources :users do
resources :events
resources :starts
end

slyszalam,ze nie powinno się zagniezdzac więcej niż 2 razy (dlatego tak wyżej napisałam)
czy mogę po prostu
resources :users
resources :events
resources :starts

nie do końca to rozumiem, jakie to ma przelozenie na działanie aplikacji…

dzięki za odpowiedz
kasia