如何避免在视图中命中数据库

时间:2016-04-29 05:15:55

标签: ruby-on-rails ruby model-view-controller

我认为不应该在视图中ping数据库......但是想知道正确的解决方案。在我的一个观点中,我需要根据每个孩子{{1}来提取@order,它的孩子items以及另一个模型Amount的信息。 }。像这样:

item

为了避免视图中的db命中,我唯一想到的解决方案是在控制器中创建所有相关数据的大量哈希值,然后从视图中访问。所以它会是这样的:

<% @order.items.each do |item| %>
  <td><%= item.name %></td>
  <td><%= Refund.where(item_id:item.id).first.amount %></td>
  <td><%= Amount.where(item_id: item.id).first.amount %></td>
<% end %>

我知道我讨厌这类问题......但我真的需要知道......这是最好的解决方案吗?还是有最好的做法?我问的原因是因为它在视图中看起来非常干净,但在控制器中非常笨重,而且当你有一组更复杂的嵌套表时它也变得非常笨重,这就是我实际拥有的(即{将哈希放在一起非常时髦(

1 个答案:

答案 0 :(得分:5)

首先,我将使用item和其他2个类之间的关联,以便您可以

public static String read(String valueKey, String valueDefault) {
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(context);
   return prefs.getString(valueKey, valueDefault);
}

而不是import urllib2 from bs4 import BeautifulSoup soup = BeautifulSoup(urllib2.urlopen('http://www.bcsfootball.org').read()) for row in soup('table',{'class':mod-container mod-no-footer mod-open'})[0].tbody('tr'): tds = row('td') print (tds[0].string, tds[1].string) 。您可以进一步定义诸如

之类的方法
    for row in soup('table',{'class':mod-container mod-no-footer mod-open'})[0].tbody('tr'):
                                                     ^
SyntaxError: invalid syntax

同样对另一个人(并希望得到一个比item.refund item.amount 更好的名字。

这样可以保持视图和控制器的清洁,但不会更快。到目前为止,所有方法都涉及每个项目运行2个数据库查询,就我而言,这是真正的问题 - 是否在视图中发生了多余的查询,或者控制器的问题较少。

但是,您可以使用Active Record的包含机制来避免这种情况:

Refund.where(...)

将批量加载命名关联,而不是在访问每个项目时一次加载一个。