Нужны данные из объединения many:many в представлении Rails
-
18-09-2019 - |
Вопрос
Возможно, это не лучшее решение в большинстве случаев, но мне нужна таблица с данными из 3 таблиц.
class Media < ActiveRecord::Base
belongs_to :user
belongs_to :type
has_many :ratings
end
class User < ActiveRecord::Base
has_many :medias
has_many :ratings
end
class Rating < ActiveRecord::Base
belongs_to :user
belongs_to :media
end
Это тот вид, который я хочу
<table>
<tr>
<th>Name</th>
<th>Comment</th>
<th>Creator</th>
<th>Type</th>
<% for user in @users %>
<th><%=h user.login %></th>
<% end %>
</tr>
<% for media in @medias %>
<tr>
<td><%=h media.name %></td>
<td><%=h media.comment %></td>
<td><%=h media.user.login %></td>
<td><%=h media.type.name %></td>
<% for user in @users %>
<td><%=h GET_RATING (media, user) %></td>
<% end %>%>
</tr>
<% end %>
</table>
В основном я хочу одну новую строку для оценок каждого пользователя для каждого носителя
То, что я хочу, - это Таблица, которая выглядит вот так:
media.name media.comment ... rating(media, user).rating
Я думаю, было бы лучше использовать join в контроллере с методами поиска мультимедиа, но я не знаю, как именно, более возможным решением может быть вспомогательный метод, который принимает media и user в качестве параметров.
Как вы думаете, что является лучшим решением для этого?
Решение
Этот вид ассоциации относится к вашей модели, для этого идеально подходит сквозная связь a has many.
class User < ActiveRecord::Base
has_many :ratings
has_many :media, :through => :ratings
end
class Media < ActiveRecord::Base
has_many :ratings
has_many :users, :through => ratings
end
class Rating < ActiveRecord::Base
belongs_to :user
belongs_to :media
end
Тогда вы сможете получить доступ
media.name media.comment
Тогда можно было бы также получить доступ
user.ratings
или:
<% media.users.each do |user| %>
## Do stuff with user.ratings array
<% end %>
Вы также можете:
media.ratings.each do |rating|
rating.your_attribute
rating.user.your_attribute
end