【问题标题】:Display a list of user's posts in Rails在 Rails 中显示用户的帖子列表
【发布时间】:2013-10-13 15:41:51
【问题描述】:

我有一个 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 => "2013",并且我需要按降序列出它们。

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

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

我应该如何设置我的控制器以能够调用 ?

【问题讨论】:

    标签: ruby-on-rails controller


    【解决方案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 来实现这一点。

    然后在控制器中,你可以预先加载所有用户和他们的 pin,每个 pin 各自的相册,像这样:

    @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
    

    【讨论】:

    • 非常感谢您为回答而付出的努力。有引脚模型和用户模型。专辑只是pin的一个属性。我认为你上面描述的方式,专辑被视为自己的模型。对吗?
    • 正确。也许那是因为我不明白你的模型?专辑似乎更像是一个独立的实体,并且是对专辑的一种评论,如果我没听错的话,不是吗?
    • 对不起,pin是整个帖子的昵称。用户添加具有以下属性的“pin”:图像(专辑封面)、专辑(标题)、艺术家(艺术家的姓名)、日期(发行年份)、排名(一年中最喜欢的排名,如#1)可以列出用户及其属性,以及他们有多少引脚,但我也试图列出这些引脚的属性。我没有能力聊天,否则我会。这会让这更容易。
    • 知道了。我更新了答案兄弟。您在不需要时使用类变量 (@)。
    • 就是这样!我不需要制作 Pin belongs_to :album,但我不明白我需要将 user.pins.each 嵌套在 users.each 中。谢谢一百万!
    【解决方案2】:
    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")
      

    【讨论】:

    • 感谢您的回复。是的,我有 pin belongs_to :users 和 users has_many :pins。 Pin 有 user_id。我的网站非常适合我目前使用它。我在具体创建 2013 页面时遇到了麻烦。使用上面的建议,当我调用 @pin.user.album 时,我得到了 #<:relation:0x007f964f893c20> 的未定义方法 `user'
    • 将 belongs_to :users 更改为 belongs_to :user (单数)。那应该可以。
    • 对不起,我的错字。我有它作为 belongs_to :user
    • 正如 mjnissim 提到的,belongs_to :user 应该解决这个问题。还在发生吗?
    • 我的朋友托尼,这完全是另外一回事。确保您没有在某个“nil”对象上调用“user”。换句话说,请确保您正在使用一个对象。只有上帝创造了 Ex nihilo...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多