Problem z aktualizacją id modelu z poziomu innej klasy

Cześć! Na początku chciałem powiedzieć że jestem początkującym programistą RoR więc być może mój problem jest trywialny do rozwiązania lecz ja męczę się z nim od dłuższego czasu.

Więc mam prostą aplikację na projekt zaliczeniowy na uczelni (pisałem ją około 20h więc są pewne niezgodności, nie trzymanie się pewnych standardów itd.) https://github.com/kamnog/e-rate. Mój problem polega na tym iż mam klasę Group i Pupil. Wszystko jak na razie działa w aplikacji lecz nie mogę aktualizować uczniów w danej klasie, tj.

  • wybieram klasę -> edytuje -> i aktualizuje pole pupil_id
    Kiedy zapiszę pole pupil_id się aktualizuje do danej wartości którą przekazałem, lecz nie aktualizuje mi się liczba uczniów w danej klasie, oraz uczeń nie zostaje przypisany do danej klasy.

W konsoli kiedy (po aktualizacji pola) szukam danej klasy, pole się aktualizuje, przykładowo w formularzu edycji mam klasę o id=7, i chcę dodać do klasy ucznia o id 8:

2.0.0-p247 :001 > g = Group.find(7)
Group Load (2.0ms) SELECT “groups”.* FROM “groups” WHERE “groups”.“id” = ? LIMIT 1 [[“id”, 7]]

Group id: 7, name: “IIIC”, teacher_id: 16, pupil_id: 8, created_at: “2014-05-18 16:51:09”, updated_at: “2014-05-30 12:05:33”

Lecz nie aktualizuje mi się karta ucznia oraz lista osób w klasie. Wyczytałem również że może być to problem związany z nested_attributes lecz tak czy siak nie rozwiązuje to mojego problemu. Tak jak pisałem wcześniej jestem jeszcze trochę zielony więc czekam na wasze opinie i pomoc :smile:. Z góry wielkie dzięki! :smile:

Ps. Warto jeszcze dodać że kiedy aktualizuję pole ucznia w konsoli to wszystko działa tak jak powinno - czyli dodaje ucznia do klasy i aktualizuje listę osób w danej klasie.

2.0.0-p247 :004 > p = Pupil.find(8)
Pupil Load (0.6ms) SELECT “pupils”.* FROM “pupils” WHERE “pupils”.“id” = ? LIMIT 1 [[“id”, 8]]
=> Pupil id: 8, email: “barbara@streisand.pl”, encrypted_password: “$2a$10$jYRe29XCYVWqO5jc2.AYh.Vqzbod1tJrIRy2G8J3X9tY…”, reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: “2014-05-18 16:35:44”, last_sign_in_at: “2014-05-18 16:35:44”, current_sign_in_ip: “127.0.0.1”, last_sign_in_ip: “127.0.0.1”, created_at: “2014-05-18 16:35:44”, updated_at: “2014-05-18 17:03:43”, name: “Barbara”, surname: “Streisand”, rate_id: nil, note_id: nil, contact: “LA 21/5”, group_id: nil
2.0.0-p247 :005 > p.group_id = 13
=> 13
2.0.0-p247 :006 > p.save
(0.3ms) begin transaction
SQL (13.0ms) UPDATE “pupils” SET “group_id” = ?, “updated_at” = ? WHERE “pupils”.“id” = 8 [[“group_id”, 13], [“updated_at”, Fri, 30 May 2014 12:27:49 UTC +00:00]]
(222.5ms) commit transaction
=> true

Być może nie wyraziłem się jasno - muszę zmienić group_id w modelu ucznia (Pupil), z poziomu grupy (Group) :smile:

Hmm, spróbuj coś w stylu group.pupils << pupil, jeśli pupil może należeć tylko do jednej grupy, to powinno nadpisać group_id w pupilu.

1 Like

Dzięki @Ravicious :slight_smile:

Spoko. W Railsowym API znajdziesz opis reszty metod, które możesz wywoływać na kolekcjach.

Przecież w kodzie tutaj https://github.com/kamnog/e-rate/blob/master/app/models/group.rb masz Group has_many :pupils. To że Group posiada pupil_id to jakaś pozostałość po poprzednim kodzie i to pole nie powinno być używane (model przynależący trzyma id obiektu nadrzędnego).

Jak to sobie wyobrażasz skoro nie masz “dostępu” do Pupila z danej Grupy, póki go do niej nie przypiszesz?

Tak, jeszcze nie porobiłem porządku po pozostałościach :smile:

W skrócie, rozwiązanie jakie podał @Ravicious było już prze zemnie testowane, lecz nie wychodziło - dlaczego? W formularzu chciałem zmienić group_id wtw gdy to pole zostanie zmienione, lecz błędnie zaimplementowałem instrukcję warunkową, w której była zawarta wyżej wymieniona odpowiedź :smile: Bądź co bądź, problem rozwiązany :smile: