我在一些javascript变量的视图中有这个代码。我可以提高效率的任何想法吗?
<% @sources.each_with_index do |source, index| %>
( <%= index %>, 1, <%= Entry.includes(:main_entries).where("classification_id =? and category_id =? and source_id =?", 1, 1, source.id).count %> )
( <%= index %>, 2, <%= Entry.includes(:main_entries).where("classification_id =? and category_id =? and source_id =?", 1, 2, source.id).count %> )
<% end %>
答案 0 :(得分:2)
乍一看这看起来有点脏,但是它是一次性查询。不要把它粘在视图中。创建一个类方法并在控制器中分配变量。
Entry.find_by_sql(["SELECT classification_id, category_id, source_id, count(*) AS count_all FROM entries WHERE source_id IN (?) AND classification_id = 1 AND category_id IN (1, 2) GROUP BY classification_id, category_id, source_id", @sources.map(&:id)]);
它将通过classification_id,category_id,source_id对条目进行分组,并计算有多少条目并将其存储为count_all(稍后循环遍历结果并调用entry.count_all)
现在你需要做的就是循环搜索结果并像之前一样输出你的javascript,但这次你不会访问数据库。
答案 1 :(得分:0)
我认为如果您创建一个类方法或范围来选择所需的所有条目,然后在视图中遍历该集合,这会更快。您当前的视图代码正在每行上进行数据库调用 - 您希望将这些代码捆绑到一个调用中。如果不了解模型之间的关系,就不容易更精确了