0

我认为这是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
4

3 回答 3

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 %>
于 2013-02-27T23:54:25.200 回答
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
于 2013-02-27T23:51:46.127 回答
0

您可以使用 ActiveRecord 关联:

class Submission
  belongs_to :user

  # etc
end

那么在你看来:

<td><%= submission.id %></td>
<td><%= submission.user.first_name</td> <!-- or whatever -->
于 2013-02-27T23:47:35.513 回答