在Rails中显示用户帖子的列表

时间:2013-10-13 15:41:51

标签: ruby-on-rails controller

我有一个用户发布相册评论的rails应用。发布的评论称为“图钉”,并上传了发布日期,专辑标题,艺术家姓名,专辑封面图片和年度排名。 (就像我今年最喜欢的一张专辑)这些针脚属于用户,用户有很多针脚。我想要做的是创建2013年的新页面,显示每个用户,然后列出专辑图像,标题,艺术家的降序排序列表作为他们年度的前十名单。类似的东西:

<% @users.each do |user| %>
<%= link_to (image_tag user.image(:small)), user %> <%= user.name %>
<ol>   
  <li><%= @pin.album %> - <% @pin.artist%></li>     
    </ol>   
<% end %>

我需要将引脚限制为:date =&gt; “2013”​​,我需要按降序列出它们。

我无法搞清楚控制器和视图。到目前为止,这是我的页面控制器:

def tens2013
  @users = User.all
  @pin = Pin.where(:date => "2013")
end

如何设置我的控制器以便能够调用&lt;%= @ pin.user.album%&gt; ?

2 个答案:

答案 0 :(得分:1)

  1. 要调用@pin.user.album,您需要首先在模型级别定义依赖关系。因此,在Pin模型中,您应该拥有belongs_to :users,而在User模型中,您应该包含has_many :pins。现在假设在Pin模型中,有一个名为user_id的字段,它将是外键。当您要访问这样的依赖类时,还要在查询中使用:include。它避免了N + 1查询问题。例如:

    @pin = Pin.includes(:users).where("date >= ?","2013-01-01") 
    
  2. 要将响应限制为仅限2013年,您可能还需要同样搜索您的查询:

    @pin = Pin.where("date >= ?","2013-01-01")
    

答案 1 :(得分:1)

我看到它的方式,你的模型应该像这样设置:

class User < ActiveRecord::Base
  has_many :pins
end

class Pin < ActiveRecord::Base
  belongs_to :user
  belongs_to :album
end

class Album < ActiveRecord::Base
  has_many :pins
end

Pin应该user_idalbum_id来实现这一目标。

然后在控制器中,你可以急切地加载所有用户及其引脚,每个引脚的相应专辑,如下所示:

@users = User.includes(:pins => :album)

或限制到某一年,请执行:

@users = User.includes(:pins => :album).where('pins.date>=?','2013-01-01').references(:pins)

现在,您可以遍历视图中的用户,以及每个用户的图钉和每个图钉的相册。

您不需要为每个用户的引脚使用@pin。在视图中进行必要的更改,并使用以下样式迭代它们:

@users.each do |user|
  # do something 
  user.pins.each do |pin|
    # Now you have "pin" and you can use it:
    # pin.album...
    # pin.artist...
  end
end