ActiveRecord - zagnieżdżone zapytanie

Cześć

Czy byłby ktoś w stanie pomóc z utworzeniem zapytania w rails? Przykładowo mam taką tabelę jak poniżej i chciałbym zaznaczyć wszystkie „joby” z jednostką unit = 300, ale tylko te, gdzie poprzedni unit miał status 1. Czyli dla unit 300 powinienem otrzymac joby 123 oraz 789, bo dla 123 byl unit 200 i on mial status 1, a dla joba 789 poprzedni unit to 100 i tez ma status = 1. Dlatego tez nie mogę założyć, że poprzedni unit to na sztywno zawsze 200 lub 100. Musze poszukać jaki jest ostatni unit i sprawdzić, czy status = 1.

W mySQL wiem jak takie coś sobie napisać używając zagnieżdżonych zapytań lub pokombinować coś z left joinem. Chciałbym to jednak napisać z użyciem ActiveRecord, ale po głębszych szukaniach w necie rozwiązań niestety nie działa to tak jak bym chciał :slight_smile: Aplikację mam napisaną w Ruby on rails 4.2.5 i pracuję z bazą MySQL

24

Nie jestem pewien czy zrozumiałem, ale może dałoby się to zrobić tak:

# Odnalezienie unitu 300 (job 789)
unit = 300
last_unit = Job.where(unit: unit).last

# Odnalezienie wszystkich powiązanych jobów (powinno zwrócić 789/1/100, 123/1/300, 123/1/200, 123/1/100
Job.where("status=1 AND job >= ?", last_unit.job)

Nie do końca rozumiem operacji ze 123 którą opisałeś, ale myślę że możnaby zrobić group który zwróciłby najnowszy rekord.

1 Like

Jesli potrafisz napisać w sql to nie męcz się z active record-active record jest do specyficznych zadań-sql to cały język i nie wszystko co się da w drugim jest możliwe w pierwszym. Czasem po prostu trzeba wiedzieć kiedy ustąpić

1 Like

I to chyba najtrafniejsze spostrzeżenie, dlatego tak też zostawiłem :slight_smile: próbowałem metodą tak jak opisuje @kwitczak, ale po testach takie zapytanie wolniej działało od czystego SQL.
Dzięki za odpowiedzi.

1 Like