我是Ruby的新手,并且正在研究其他人编写的代码。我们不得不使用已弃用的版本:Ruby 1.8.7和Rails 2.3.5 - 因为这是发展中国家的慈善机构,没有升级能力。
我有一份报告,它会生成一张表(药物库存),需要按药物的名称对其进行分类。
相关的控制器代码如下所示:
all_drugs = Drug.find(:all,
:order => "name ASC")
@stock = {}
all_drugs.each{ |drug|
drug_id = drug.drug_id
first_date = Pharmacy.active.find(:first,
:conditions =>["drug_id =?",drug_id],
:order => "encounter_date").encounter_date.to_date rescue nil
next if first_date.blank?
next if first_date > @end_date
start_date = @start_date
end_date = @end_date
stock_at = Pharmacy.stock_at(drug_id,end_date)
if stock_at > 0
last_activity = "In stock"
else last_activity = Pharmacy.last_activity(drug_id,end_date)
end
drug = Drug.find(drug_id)
drug_name = drug.name
@stock[drug_name] = {"dispensed" => 0,"stock_at" => 0,"removed" => 0, "receipts" => 0,"prescribed" => 0,"last_activity" => 0}
@stock[drug_name]["dispensed"] = Pharmacy.dispensed_drugs_since(drug.id,start_date,end_date)
@stock[drug_name]["stock_at"] = stock_at
@stock[drug_name]["removed"] = Pharmacy.total_removed(drug.id,start_date,end_date)
@stock[drug_name]["receipts"] = Pharmacy.total_delivered(drug.id,start_date,end_date)
@stock[drug_name]["prescribed"] = Pharmacy.prescribed_drugs_since(drug.id,start_date,end_date)
@stock[drug_name]["last_activity"] = last_activity
}
相关的视图代码如下所示:
<%count = 1
@stock.each{|name,values|
prescribed = values["prescribed"]
receipts = values["receipts"]
dispensed = values["dispensed"]
removed = values["removed"]
stock_at = values["stock_at"]
last_activity = values["last_activity"]
%>
<tr>
<td class="color_<%=color%>"><%=name%></td>
<td class="color_<%=color%> caldata" id="stock_at_<%=count%>"><%=stock_at%></td>
<td class="color_<%=color%> caldata" id="removed_<%=count%>"><%=removed%></td>
<td class="color_<%=color%> caldata" id="prescribed_<%=count%>"><%=prescribed%></td>
<td class="color_<%=color%> caldata" id="dispensed_<%=count%>"><%=dispensed%></td>
<td class="color_<%=color%> caldata" id="last_activity_<%=count%>"><%=last_activity%></td>
<td class="color_<%=color%> caldata" id="receipts_<%=count%>"><%=receipts%></td>
</tr>
<% count+=1
}%>
这很愉快地生成了正确的表,但是以随机顺序(重新启动服务器并重新加载页面将以新的顺序提供表)。
我尝试过在网上找到的各种选项。我尝试@stock.all.order
(在Rails 2.x中不起作用),@stock.find
(不接受2个参数,:all
和:order
,并仅使用{{1没有帮助),:order
(没有效果)和@stock.sort
(没有效果)。所有这些都放在控制器代码的末尾或视图代码中的@stock.sort_by
之前。
我不得不说我特别感到困惑的是订单是随机的 - 我会假设即使我没有按名称订购,订单仍然是一致的......
非常感谢任何帮助!
答案 0 :(得分:1)
Ruby 1.8.7中的哈希没有订购,所以你不能依赖@stock中键的顺序。
作为解决方法,我首先查询药物仅选择 ID 和名称字段
all_drugs = Drug.find(:all, :select => "id, name")
因为您在代码中稍后查询单一药物属性。
然后我在@stock哈希定义之后创建一个空的@stock_keys 数组来收集药物名称
@stock = {}
@stock_keys = []
并在查询drug_id
后立即将药物名称输入其中drug = Drug.find(drug_id)
drug_name = drug.name
@stock_keys << drug_name
@stock[drug_name] = ...
在 all_drugs 的迭代结束时,在您的控制器中,我对@stock_keys数组进行排序
@stock_keys.sort!
然后,在视图中,我迭代@stock_keys数组,在每一步检索来自@stock哈希值的药物值
@stock_keys.each do |name|
values = @stock[name]
prescribed = values["prescribed"]
...
end
我希望这可以提供帮助。
答案 1 :(得分:1)
哈希在ruby 1.8.7中的定义是无序的(请检查Ruby 1.8: Hash#sort not return hash but array (better way to do this?))因此我们必须将该顺序用作数组。没有排序哈希这样的东西。在您的视图中更改行
TweetSet
到
@stock.each{|name,values|