Rails - 将逻辑从每个循环移动到控制器

时间:2014-08-21 07:21:57

标签: ruby-on-rails-4

我有两个模型 - book.rb -

class Book < ActiveRecord::Base
      belongs_to :user
end

和user.rb -

class User < ActiveRecord::Base
    has_many :books
end

books_controller.rb包含

def index
    @books = Book.all
end

在/books/index.html.erb我有

<%= @books.each do |books| %>
  <%= book.title %>
  <%= User.find(book.user_id).name %>
 .....

这一切都很好 - 但我应该在控制器中有更多的逻辑吗?如果是这样,我如何将图书ID从块传递到控制器以传回用户名?

2 个答案:

答案 0 :(得分:0)

没有必要这样做。由于您已经拥有belongs_to关系,因此您可以将视图编写为:

<%= @books.each do |books %>
  <%= book.title %>
  <%= book.user.name %>
 .....

答案 1 :(得分:0)

更快的方法是:

def index
  @books = Book.includes(:user)
end

这将执行2个SQL查询,一个用于获取所有书籍,另一个用于获取所有关联用户。这在查询数量方面要便宜得多,因为如果您有10本书,如果您只使用Book.all(一个用于获取所有书籍,一个用于每本书以获取其用户),则必须执行11个查询)。

视图可以保持不变:

<%= @books.each do |book| %>
  <%= book.title %>
  <%= book.user.name %>
  .....