Pobieranie danych z "rodzica" - tablice asocjacyjne

EDIT: Rozwiązane!

Witam! Posiadam taką konstrukcję aplikacji:

model User has_many :news
model News belongs_to :user

A routing wygląda tak, że:
/news - wyświetla wszystkie newsy
/users/5/news - wyświetla newsy użytkownika o id 5

Podczas wyświetlania newsów wyświetlam ich autora (właściciela, w tym przypadku obiekt User). W drugim przypadku wyświetlanie autora jest proste - listuję @user.news.all i dorzucam @user.nickname. Co jednak w pierwszym przypadku (listowanie poprzez News.all), kiedy jedyne, co łączy te dwa obiekty to user_id? Mogę zrobić tak:

<% @news.each do |news| %>
<h3><%= news.title %> ~ <%= User.find_by_id(news.user_id).nickname %></h3>
<div><%= news.content %></div>
<% end %>

Ale po pierwsze jest to niezgodne z konwencją MVC, ponieważ widok komunikuje się z modelem, a po drugie zakatuje to bazę danych dodatkowymi żądaniami.

W jaki w takim razie sposób mogę pobrać autora każdego newsa, w przypadku listowania ich wszystkich?

EDIT:
news.user.nickname
Rails jest genialny, temat rozwiązany ^^

W modelu News jest przecież asocjacja :user, więc można bez problemu odwołać się do użytkownika (news.user.nickname). Żeby uniknąć problemu N+1 zapytań, przy czytaniu listy newsów należy dołączyć asocjację :user (News.includes(:user)).

Dzięki za informację @Jacek. Sądziłem, że taki problem nie wystąpi. W każdym razie dołączyć to do News.all, prawda? Bo w przypadku @user.news.all zapytanie jest automatycznie limitowane przez konkretnego usera.

Owszem. Wyświetlając newsy użytkownika potrzebne będą maksymalnie dwa zapytania (użytkownik oraz jego newsy). W przypadku listy newsów konieczne jest pobranie każdego użytkownika i tutaj podejście naiwne byłoby bardzo niewydajnej.

1 Like