Нужны данные из объединения many:many в представлении Rails

StackOverflow https://stackoverflow.com/questions/1298932

Вопрос

Возможно, это не лучшее решение в большинстве случаев, но мне нужна таблица с данными из 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top