Aktywne Wpisy
Guadalajara +152
W końcu się zdecydowałam i kupiłem mieszkanie :) co prawda w Katowicach a nie w Krakowie (jak wcześniej zakładałem), ale udało się sporo urwać od ceny ofertowej, warto dzwonić i negocjować aż ktoś spuści z ceny. Fajna lokalizacja zaraz przy Trzech Stawach, będzie gdzie z pieskiem na spacery chodzić. Pracuję zdalnie, więc wolałem już osiedlić się w Kato niż kredytować się dużo więcej, a połączenia do Krakowa też są dobre. Wreszcie na
Beznazwyy +177
Sprawność mechaniczna silników spalinowych w peaku dochodzi do 90%.
Jest to praktycznie nieznany fakt, często przykrywany informacją o niskiej sprawności cieplnej.
Panuje opinia, że silnik pozbawiony strat energii, takich jak tarcie, osiągnąłby 100% sprawność cieplną. Jest to jednak bzdura stojąca w sprzeczności z drugą zasadą termodynamiki. Taki silnik, pracując w cyklu Otta ze stopniem sprężania 10, nie byłby w stanie osiągnąć sprawności cieplnej nawet na poziomie 50%.
Nagrałem krótki materiał o sprawności mechanicznej, który
Jest to praktycznie nieznany fakt, często przykrywany informacją o niskiej sprawności cieplnej.
Panuje opinia, że silnik pozbawiony strat energii, takich jak tarcie, osiągnąłby 100% sprawność cieplną. Jest to jednak bzdura stojąca w sprzeczności z drugą zasadą termodynamiki. Taki silnik, pracując w cyklu Otta ze stopniem sprężania 10, nie byłby w stanie osiągnąć sprawności cieplnej nawet na poziomie 50%.
Nagrałem krótki materiał o sprawności mechanicznej, który






1. Mam tabelę Articles i tabelę Votes. Artykuły są voteable.
2. Jeden użytkownik może zagłosować na jeden artykuł raz.
3. Przy wejściu na stronę główną serwisu użytkownik niezalogowany i zalogowany widzą to samo - 10 ostatnich artykułów.
4. Jeśli użytkownik jest zalogowany -> nie może głosować na artykuły, na które już zagłosował (jest to przedstawione wizualnie na elemencie listy - z frontem nie mam problemu).
Problem: w przypadku gdy użytkownik jest zalogowany chcę aby API zwracało razem z artykułami dodatkowy atrybut dla każdego z nich, informujący czy current user już zagłosował czy jeszcze nie.
Próba rozwiązania: Początkowo zrobiłem eacha, który sprawdzał dla każdego z artykułów czy istnieje głos current user'a na dany artykuł i na tej podstawie dodawałem wirtualny atrybut do każdego artykułu ze statusem głosowania - raz, że jest to skrajnie niewydajne bo mnożę niepotrzebne zapytania, a dwa, że i tak render json: nie zwracał wirtualnego atrybutu w danych.
Próbowałem też powalczyć SQLem żeby zwracać razem z artykułami liczbę głosów danego użytkownika, ale wtedy dostawałem tylko te artykuły, na które użytkownik zagłosował.
Mimo wertowania w poszukiwaniu podobnego problemu nie znalazłem "jedynej słusznej railsowej metody". A może źle do tego podchodzę? Ktoś ma pomysł?
#rails #rubyonrails #webdev
Komentarz usunięty przez autora
@WaveCreator: Pewnie przez
INNER JOINłączyłeś, a trzeba byłoLEFT, żeby dołączyć NULL gdy nie głosował.Uproszczona schema:
Article -> id, title, content, userVote -> voteable_type, voteable_id, userUser ->Funkcje **eager_load i includes domyślnie korzystają z LEFT OUTER JOIN, a mimo tego jeśli na łączonej za ich pomocą tablicy zastosujesz funkcję where** to wywali ci wszystkie rekordy z lewej strony, które nie mają powiązania (co jak widać dziwi nie tylko nas).
Article.all.eager_load(:votes).where(votes: { user_id: current_user })Zwróci wyłącznie te artykuły, na które zagłosował obecnie zalogowany użytkownik. Brakuje mi możliwości filtrowania zwracanych przez eagerload/includes powiązań -
scope :voted, -> (user_id) { where(:votable_by => user_id) }@updater: Ostatecznie tak zrobiłem minutę temu ogarniając też dodatkowy atrybut z poziomu SQL.
scope :with_votes, -> (current_user) {select("articles.*, CASE WHEN votes.user_id IS NOT NULL THEN true ELSE false END AS voted")
.joins(sanitize_sql_array(["LEFT JOIN votes ON votes.voteable_id = articles.id AND votes.voteable_type = 'Article' AND votes.user_id =