我需要我的Rails应用程序来生成大表(大约5-7列,大约2000-3000行),它用于公司内部使用,所以我们不关心流量等等。
正在显示的对象的结构应该非常灵活:当添加/更改/删除某些列时,它只在一个地方(除了修改数据库模式之外)和所有视图(索引,显示,编辑表单)进行更改)自动更新。
我以前完全没有Rails的经验。我把偏序作为重用代码的一种方式(这是好事),因此,我在使用嵌套的子子部分时没有看到任何坏处。说,我有几个模型,index
每个模型render
的通用部分gen_index
,并且对于表格的每个单元格都有特殊的部分gen_field_view
。
从gen_field_view
视图呈现相同的部分show
,因此,我真的希望将其作为部分视图。
如果我只有600行和5列,则此部分会呈现3000次。这对我来说是一个巨大的惊喜,Rails很难:它目前需要大约7秒才能生成页面。如果我删除gen_field_view
部分并将其直接包含在gen_index
部分中,则大约需要3秒钟:速度提高两倍以上(无论如何这都很慢,但这是不同的故事)。
看来,我们应该避免这种情况的嵌套部分,但是,我们还应该使用什么来重用视图代码?
我们可能会从模型中的某个方法返回html代码,但它实际上会杀死Rails的想法,毕竟它不方便。
答案 0 :(得分:1)
使用缓存策略怎么样?您可以使用rail's fragment cashing feature:
<% Product.all.each do |p| %>
<% cache(p) do %>
<%= render partial: 'some_partial', locals: {product: p} %>
<% end %>
<% end %>
答案 1 :(得分:0)
您可以尝试的一些事情是
在页面上将记录渲染为json并渲染表格行的模板,然后使用javascript渲染实际表格
<div id="data" data-records="<%= @products.to_json %>"></div>
<script>
jQuery.each(jQuery("#data").data("records"), function(record) {
jQuery("<li>").text(record.title).appendTo("#my-table")
})
</script>
使用将html呈现为字符串
的演示文稿对象class ModelPresentation
def initialize(model)
@model = model
end
def render
[title, rate].join
end
def title
"<h3>@model.title</h3>"
end
def rates
"<span>Rate #{@model.score}</span>"
end
end