我得到一个不应该ping视图中的数据库...但想知道正确的解决方案。在我的一个观点中,我需要根据每个子女item
获取有关@order
,它的子女items
以及另一个模型Amount
的信息。事情是这样的:如何避免在视图中打数据库
<% @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 %>
为了避免在视图中点击分贝的缘故,我已经想到的唯一的解决办法是建立在控制器中的所有相关数据的一个巨大的哈希值,然后访问从视图。因此,这将是这样的:
# controller (writing quickly, code may not be totally right, hopefully you get gist
data = Hash.new
data["items"] = []
@order.items.each do |item|
item_hash = {
"name" => item.name,
"amount" => Amount.where(item_id: item.id).first.amount,
"refund" => Refund.where(item_id:item.id).first.amount
}
data["items"] << item_hash
end
# view code
<% data["items"].each do |item| %>
<td><%= item["name"] %></td>
<td><%= item["refund"] %></td>
<td><%= item["amount"] %></td>
<% end %>
而且我知道这么讨厌这种类型的问题...但我真正需要知道的是......最好的解决办法?还是有最佳做法?我问的原因是因为它在视图中看起来非常干净,但在控制器中非常庞大,而且当你有一套更加复杂的嵌套表时(这实际上就是这样)(即data
哈希将是相当时髦的放在一起)
记住'{}'和'Hash.new'一样好,简洁得多。 – tadman
物品,退款和金额之间的关联是什么?一对一,一对多?即项目has_one:退款?你的问题表明物品可能有很多退款,但我的问题是这是你的意图吗? – jverban