Rails 3:如何将代码从视图移动到控制器(或模型)?

时间:2013-02-27 23:45:16

标签: ruby-on-rails

我在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

3 个答案:

答案 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 -->