我在index
视图中有这个:
<% @submissions.each do |submission| %>
<tr>
<td><%= submission.id %></td>
<td><%= User.find_by_id(submission.user_id).name.to_s %></td>
</tr>
<% end %>
我知道我不应该在视图中使用find_by
。
如何将其移至控制器(或模型)?
我尝试在我的index
控制器的submission
方法中插入并使用username
变量,但它不起作用。
def index
@submissions = Submission.all
@submissions.each do |submission|
username = User.find_by_id(submission.user_id).name.to_s
end
end
答案 0 :(得分:3)
模型,添加与用户的关系
class Submission
belongs_to :user
end
控制器,急于加载用户以避免N + 1查询。
def index
@submissions = Submission.includes(:user).all
end
查看,只是为每个提交的用户投影
<% @submissions.each do |submission| %>
<tr>
<td><%= submission.id %></td>
<td><%= submission.user.name.to_s %></td>
</tr>
<% end %>
答案 1 :(得分:2)
#in controller
def index
@submissions = Submission.all
end
#in view
<% @submissions.each do |submission| %>
<tr>
<td><%= submission.id %></td>
<td><%= submission.user.name %></td>
</tr>
<% end %>
此代码表示您已声明以下关系:
belongs_to :user
has_many :submissions
(或has_one)您可以使用预先加载(对数据库使用较少的查询)来改进以前的代码:
@submissions = Submission.includes(:user).all
答案 2 :(得分:0)
您可以使用ActiveRecord关联:
class Submission
belongs_to :user
# etc
end
然后在你看来:
<td><%= submission.id %></td>
<td><%= submission.user.first_name</td> <!-- or whatever -->