请使用正在尝试创建第一个原始应用程序的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
答案 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
User
以p.user
返回他们的用户名(取决于您通过应用程序的使用情况)。