Rails查询以获取论坛主题中的所有帖子,然后获取每个帖子的用户

时间:2015-05-30 14:38:46

标签: ruby-on-rails

请使用正在尝试创建第一个原始应用程序的Ruby on Rails noob。

以下是我的协会:

class Forum
  has_many :topics
  has_many :posts
end

class Topic
  has_many :topics
  belongs_to :forum
end

class User
  has_many :posts
end

class Post
  belongs_to :user
  belongs_to :topic
end

我想查询主题显示页面,该页面首先获取该主题中的所有帖子;他们将topic_id作为外键将他们与主题联系起来。我成功地走了这么远:

@topic = Topic.find(params[:id])
@posts = Post.where("topic_id = ?", @topic.id)

然后,我想通过使用每个帖子记录中的外键user_id来获取每个帖子的每个用户。我想知道我是否应该以某种方式嵌套属性,但是无法弄清楚正确的Rails语法然后获取每个Post的用户。

最终的主题节目视图将具有以下内容:

主题#1
   帖子#1标题
   岗位#1身体
   由Post.created_at发布的User.username

帖子#2标题
   岗位#2身体
   由Post.created_at发布的User.username

3 个答案:

答案 0 :(得分:0)

我认为您可以使用地图功能。

@users = @posts.map(&:user)

答案 1 :(得分:0)

你可以这样做:

@topic = Topic.find(params[:id])
@posts = @topic.posts 
   //instead of doing
   @posts = Post.where("topic_id = ?", @topic.id)
@post_users = @posts.map(&:user)

答案 2 :(得分:0)

我不认为你想要一个@users变量,正如其他答案所暗示的那样。虽然确定映射到新阵列会使您在帖子和作者之间找到一对一的关系,但您需要在视图中显示额外的逻辑。

您真正想要的是让您的观点进入每个帖子并获得user,您已经通过关联获得了该帖子。您可以像这样构建视图:

<h1><%= @topic.name %></h1>
<% @posts.each do |post| %>
  <h2><%= p.title %></h2>
  <p><%= p.body %></p>
  <p>Posted by <%= p.user.username %> at <%= p.created_at %></p>
<% end %>

由于p.user.username是违反电子邮件的法律,您可能需要delegate给帖子用户,或者写to_s Userp.user返回他们的用户名(取决于您通过应用程序的使用情况)。