0

在大多数情况下,它可能不是最好的解决方案,但我想要一个包含 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

我认为最好在控制器中使用带有媒体查找方法的连接,但我不知道如何准确,足够可能的解决方案可能是将媒体和用户作为参数的辅助方法。

您认为最好的解决方案是什么?

4

1 回答 1

1

这种关联属于你的模型,一个有很多直通关系非常适合这个。

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
于 2009-08-19T10:40:42.113 回答