非常感谢您查看我的问题。我试图弄清楚在控制器中创建更多实例变量是否有任何性能优势(或任何其他好处),而不是使用模型方法访问视图中的关系。这是我的意思的一个例子
你可以这样:
# 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答案。
谢谢!
答案 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
查询问题..