Zapytanie do bazy

Poczytałem AR i zdecydowanie przy tym pozostanę. Jednak chciałbym się upewnić czy dobrze to rozumiem.

Mam 3 tabele:
przychodnia
oddzial
struktura

Każda przychodnia ma kilka oddziałów.
Tabela ‘struktura’ jest tabelą wiążącą obie te tabele. W niej przechowuje id_przychodnia i id_oddzial.
Mając id przychodni chcę zwrócić sobie id oddzialow należących do tej przychodni i wyświetlić nazwy tych oddziałów.
I o ile dobrze zrozumiałem powinienem skorzystać z ‘has_and_belongs_to_many’ czy raczej ‘has_many’?
I jak to potem zwrócić w kontrolerze?

przychodnia ma odziały (tak piszesz) więc 1-wielu, struktura tabelka nie potrzebna,

has many i belongs_to cie interesuje. powinienes w tabelce oddzial miec pole przychodznia_id i tyle AR sobie resztę sam zrobi

chcesz po swojemu? Ok

[code=ruby]p = Przychodznia.find(id)

s = Struktura.all(:conditions => [“przychodznia_id = ?”, p.id])[/code]
no i teraz w s masz wszytskie oddzialy nalezace do przchodni.

Iterujesz jak chcesz je wypisac

s.each do ..... .... end
jakoś tak powinno działać

Niestety muszę pozostać przy tej tabeli ponieważ mój prowadzący tak zadecydował. A więc wystarczy has many i belongs_to?

jak chcesz ręcznie to nic nie musisz, możesz zrobić samemu tak jak wyżej napisałem

[code= Ruby]class Clinic < ActiveRecord::Base
has_many :departments
end

class Department < ActiveRecord::Base
belongs_to :clinic
end[/code]
I teraz korzystając z http://www.apohllo.pl/guides/association_basics.html w widoku robisz np:

<% @clinic.departments.each do |department| %> <%=h department.name %> <% end %>
To jest naprawdę tak proste.

gotar tak jak napisałeś właśnie przedtem robiłem i jest ok…zwróciłem sobie id wszystkich oddziałów, ale chciałbym właśnie teraz z tabeli ODDZIAL pobrać nazwy wszystkich oddziałów mających id takie jakie uzyskałem w sposób podany przez Ciebie…i tu jest problem?

Jeśli oddział może należeć, tylko do jednej przychodni, to model zaproponowany przez prowadzącego jest do kitu.

Jeśli prowadzący jest sensowny, to wynika z tego, że ten sam oddział może być w wielu przychodniach (trochę to dziwne, ale chyba o to chodzi).

Masz zatem relację wiele do wielu kliniki z odziałami i tu masz wszystko ślicznie wyjaśnione:
http://www.apohllo.pl/guides/association_basics.html#wybr-pomidzy-has-many-through-i-has-and-belongs-to-many

Nie ma problemu

a = [] s.each do |aaa| a << Odzial.find(aaa.odzial_id).name end
i w tablicy a masz wszytskie nazwy

jeśli to widok to możesz od razu wyświetlić zamiast przerzucać do tablicy drukujesz na wyjście i tyle.

Można by z tego oczywiście zrobić metodę pomocniczą, przerzucić do controllera co trzeba, ale jak nie chcesz się zagłębiać w ideologia, a chcesz b działało ci raz do projektu i zapomnieć to tak będze działać

Ale jak pisze Tjeden podejrzana jest ta tablica do złączenia. Na pewno nie jest to relacja wiele-wiele?

Może nie za pięknie, ale w najłatwiejszy dla zrozumienia sposób chyba

Właśnie sobie to przemyślałem…i rzeczywiście to jest bez sensu…bo idąc dalej…oddział ma kilka poradni i tutaj też mam tabele pośredniczącą która do niczego nie jest potrzebna…potem każda poradnia ma gabinety i tu jest tabela łącząca poradnie z gabinetami…przetrzymująca id_gabinetu i id_poradni…ponieważ w jednym gabinecie może być kilku lekarzy…przyjmujących o różnych porach…i tutaj tak samo wiem jak zwrócić id tych gabinetów tyle że muszę później zwrócić sobie nazwy tych gabinetów których id otrzymałem.

Nie zdążyłem przeczytać poprzedniego postu…dzięki o to mi chodziło…a tamte pośredniczące wywale i jakoś to wytłumacze bo rzeczywiście w tym sensu nie…bo tak jak mówiłem…np dany oddział może być tylko w jednej przychodni.

Jeszcze raz dzięki

No to nazwy tak samo jak wyzej, iterujesz, po id i szukasz obiektu, zwracasz jego nazwe i tyle

Kto układał taki schemat bazy? I jakie pola zawiera tabela struktura?

@michal_sz wygląda na to, że idziesz dobry tropem z tymi zmianami schematu bazy, szczególnie jeśli tabela struktura zawiera tylko kolumny przychodnia_id i oddzial_id. Powodzenia w bojach z prowadzącym! :)

BTW na której uczelni studiujesz?

Mam jeszcze pytanie…bo jakoś nie mogę nic znaleźć…czy jeśli chcę wywołać funkcję utworzoną w oraclu z poziomu rubiego to będzie to na tej samej zasadzie jak w przypadku tabel…to znaczy mogę użyć ‘find_by_sql’?
Przy utworzeniu modelu ‘wolne_godz_’ (funkcja nazywa się ‘wolne_godz_s’) i użyciu ‘find_by_sql’ wyrzuca mi taki błąd:

Expected ./app/models/wolne_godz_.rb to define Wolne_godz_

jak to powinienem zdefiniować?

PS. tjeden schemat bazy jak się okazuje zawierał trochę błędów…juz to poprawiłem pozbywając się między innymi tabeli struktura która nic nie wnosiła a wręcz utrudniała
hekto5 na agh…a z prowadzącym to myślę że jakoś się zrozumiemy;)

albo do małych rzeczy

results = ActiveRecord::Base.connection.select_all “select my_function
(‘some argument’) value from dual”
puts results.first[‘value’]

coś takiego google zwraca

Nie za bardzo to rozumiem. A mając takie zapytanie w SQL

SELECT GAB_ID AS GABINET_ID, SWIAD_ID AS SWIADCZENIE_ID, TO_CHAR(GODZ, 'HH24:MI') AS GODZINA, GABINET_S.NAZWA AS GABINET, SWIADCZENIE_S.NAZWA AS SWIADCZENIE FROM TABLE (WOLNE_GODZ(session[:poradnia_id], session[:pracownik_id], TO_DATE('26-05-2010', 'DD-MM-YYYY'))), GABINET_S, SWIADCZENIE_S WHERE GABINET_S.ID = GAB_ID AND SWIADCZENIE_S.ID = SWIAD_ID
jak to powinno wyglądać w RoR?

Bez odpowiedniego rzutowania Model-Tablica nic takiego nie uzyskasz w RoR z automatu, no przynajmniej mi nic do głowy nie przychodzi. Możesz to jedynie wpisać na sztywno, upraszczając, bo konwersje i wybór zrobisz po stronie aplikacji. Sam wole na bazę przerzucać co się da, ale Oracle nie znam więc nie pomogę.

Spróbuj tak

@result = ActiveRecord::Base.connection.execute("SELECT * FROM ... WHERE GABINET_S.ID = ? AND SWIADCZENIE_S.ID = ?", gab_id, swiad_id)

no i poźniej już mając obiekt @result robisz co tam chcesz

ale ten gem do Oracle co ci wynalazłem nic nie wnosi pomocniczego?

Własnie próbowałem tak jak mówiłeś…dałem w kontrolerze:

 @result = ActiveRecord::Base.connection.execute("SELECT * FROM TABLE (WOLNE_GODZ(1,1, TO_DATE('26-05-2010', 'DD-MM-YYYY')))")

i nic się nie sypało…tyle że nie wiem jak się teraz odwołać do tego?..próbując coś wyświetlić wysypuje mi się błąd

no marshal_dump is defined for class OCIStmt

a co zawiera @result? jakiś debug?

TO znaczy?
a tak w ogóle to czy to nie powinno być w modelu?

to znaczy

albo w widoku

<%= debug @result %>

i pokaż co wypluje, albo w w kontrolerze lub modelu( w zasadzie gdziekolwiek):

logger.info @result.inspect

albo

puts @result.inspect

i pokazujesz co takiego dostajesz w logach …

/--------- EDIT ---------/

a w modelu owszem powinno być, ale już od jakiegoś czasu nie trzymasz się konwencji railsowych, więc pewnie koledzy uznali, że można pisać jak w php :stuck_out_tongue: