我有一个用户发布相册评论的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; ?
答案 0 :(得分: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")
要将响应限制为仅限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_id
和album_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