1

我有一个 Rails 应用程序,用户可以在其中发布专辑评论。发布的评论被称为“pins”,并上传了发布日期、专辑名称、艺术家姓名、专辑封面图片和年度排名。(就像我今年最喜欢的第一张专辑一样)引脚属于用户,用户有很多引脚。我想做的是为 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 => "2013" 并且我需要按降序列出它们。

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

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

我应该如何设置我的控制器以便能够调用 <%= @pin.user.album %> ?

4

2 回答 2

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 和每个 pin 的相册。

您不需要@pin为每个用户的 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
于 2013-10-13T20:17:00.390 回答
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")
    
于 2013-10-13T16:01:42.607 回答