【问题标题】:Need data from a many:many join in a Rails view在 Rails 视图中需要来自 many:many 的数据
【发布时间】:2009-08-19 10:11:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails database has-and-belongs-to-many


    【解决方案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
    

    【讨论】:

    • thanx 帮助很大,但我认为它没有运行完整: 这就是我现在所拥有的,问题是当用户没有给他评分时不在 media.users 列表中,所以我得到一个每行具有不同 td 计数的表。
    • 不,它不起作用。通过 media.users,我得到了所有对该电影评分的用户。使用 media.users.ratings 我得到了用户给出的所有评级,但不仅仅是该媒体。因此,如果我给电影 1 的用户 A 评级和电影 2 的另一个评级,然后我得到电影 1 的两个投票和电影 2 的两个投票。所以解决方案是无效的或只是部分的。
    • 这是正确的技术。您需要填充关联。
    • K 我将其标记为已回答,因为我认为您已回答。目前,我使用另一个代码来解决“自定义字段”问题,用户可以在其中设置标题和值,这样代码就不再出现在应用程序中了。但我从中学到了很多。谢谢
    猜你喜欢
    • 2017-12-20
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多