Ruby-on-Rails - 显示已排序表的问题

时间:2016-06-01 08:10:33

标签: ruby-on-rails ruby html-table

我是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之前。

我不得不说我特别感到困惑的是订单是随机的 - 我会假设即使我没有按名称订购,订单仍然是一致的......

非常感谢任何帮助!

2 个答案:

答案 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|