Rails - 在Controller中创建额外的实例变量与在视图中访问关系

时间:2017-06-20 03:17:28

标签: sql ruby-on-rails ruby activerecord

非常感谢您查看我的问题。我试图弄清楚在控制器中创建更多实例变量是否有任何性能优势(或任何其他好处),而不是使用模型方法访问视图中的关系。这是我的意思的一个例子

你可以这样:

# posts_controller.rb
def show
  @post = Post.find(id)
  @comments = @post.comments
end

# posts/show.html.erb
<%= @comments.each do |c| %>
...

或者,或者:

# posts_controller.rb
def show
  @post = Post.find(id)
end

# posts/show.html.erb
<%= @post.comments.each do |c| %>
...

这些方法中的任何一种都有性能优势吗?您何时应该决定创建一个额外的实例变量,而不是通过视图中的模型方法访问数据?还有其他理由选择其中一个吗?有更好的方法吗?要求教育目的和缺乏Google答案。

谢谢!

1 个答案:

答案 0 :(得分:1)

不建议从视图中查询数据库的任何调用,这是它分离的原因 M - V - C ,是控制器应该查询数据库并使用instance variables向视图提供现成的对象。

在上面提到的示例中,虽然第一个是更好的选项,但它会查询db两次,在这种情况下,您应该在同一个调用中包含注释。

def show
  @post = Post.find(id).includes(:comments)
end

然后在你看来,

<%= @post.comments.each do |c| %>

很好,因为事先有preloaded comments ..

获取控制器中的所有必需数据也有助于减少N+1查询问题..