2016-06-01 14 views
0

Rubyの新機能で、他の誰かが書いたコードで作業しています。これは開発途上国の慈善団体であり、アップグレードする能力がないため、廃止予定のバージョン:Ruby 1.8.7とRails 2.3.5で作業する必要があります。Ruby-on-Rails - ソートされたテーブルを表示する際の問題

私は、テーブル(ドラッグインベントリ)を作成し、その薬剤の名前でソートする必要があるというレポートを持っています。

は、関連する制御コードは次のようになります

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を試してみました。@stock.find:all:orderの2つの引数を受け入れず、ちょうど:orderを使用しても役に立たない)、@stock.sort(効果なし)、@stock.sort_by(効果なし) 。これらのすべては、コントローラコードの最後またはビューコードの@stock.eachの直前に配置されます。

私は特に順序はランダムであることに困惑していますと言っている - 私は名前でそれを注文することができなかった場合でも、注文はまだ一致するであろうと推測しているだろう...

どれでも役立つだろう非常に感謝される!

+0

にライン

@stock.each{|name,values| 

を変更するには、.sortを試してみましたか? –

+0

ありがとう、ありがとう、@stockで '.sort'と' .sort_by'の両方を試しました - それを明確にするために質問を更新します。私は単純な@ stock.sortを試しただけでなく、 '@stock.sort_by {| a | a [0]} '、および' @ stock.sort {| a、b | b [:name] <=> a [:name]} '、これは私がこのサイトで見つけた他の回答に基づいています。いずれもうまくいきませんでしたが、もちろん私は構文が間違っているかもしれません。特に、@stock配列の構造と索引付けを完全に理解しているとは確信していません。 – Phueal

+0

'@ stock'は配列ではありません。インスタンス変数で、ハッシュとして宣言されています: '@stock = {}'。おそらく '@stock.sort_by {| k、v | v} '、または' @stock.keys.sort.each {| k | } ' –

答えて

1

ハッシュは、ルビ1.8の定義によって順序付けされていません。7(Ruby 1.8: Hash#sort not return hash but array (better way to do this?)をチェックしてください)ので、配列として配列を使用する必要があります。ソートされたハッシュのようなものはありません。あなたのビューで

@stock.sort_by {|s, v| s.downcase}.each{|name,values| 
+0

ありがとうございますが、これは違いはありません。リストは未分類です。 – Phueal

+0

"@stock"変数をダンプし、最初の3行を送ってください。 'puts @stock' – pshoukry

+0

ダンプの開始は次のようになります(もちろんダミーデータ): {"Paracetamol(250mg)" => { (1g)」、「領収書」=> 10000.0、「処方」=> 0、「分注」=> 0、「last_activity」=>「在庫あり」、「削除」=> 0、「stock_at」=> 10000.0} "0"、 "dispensed" => 0、 "last_activity" => "在庫あり"、 "removed" => 0、 "stock_at" => 10000.0}、 「EFV(エファビレンツ600mg錠)」=> NB私は数回サーバーをリロードし、そのたびに薬の順序が変わりました。 – Phueal

1

Ruby 1.8.7のハッシュが注文されていないため、@stockのキーの順序に頼ることはできません。回避策として

は、最初に私が唯一 IDフィールド

単一の薬剤は、コードの後半での属性のためにあなたが照会されているよう
all_drugs = Drug.find(:all, :select => "id, name") 

を選択薬を照会したいです。

それから私は、薬剤名を収集するだけで@stockハッシュ定義の後

@stock = {} 
@stock_keys = [] 

と右drug_id

ためのクエリの後、それに薬物名をプッシュするために、空の@stock_keys 配列を作成したいです all_drugs上の反復の終わりに
drug = Drug.find(drug_id) 
drug_name = drug.name 
@stock_keys << drug_name 
@stock[drug_name] = ... 

、あなたのコントローラでは、私は@stock_keysの配列をソートしたい

@stock_keys.sort! 

次に、ビューで、私はそれぞれ、私はこれが役立つことを願って@stockハッシュ

@stock_keys.each do |name| 
    values = @stock[name] 
    prescribed = values["prescribed"] 
    ... 
end 

からの薬物の値をステップで取得し、@stock_keys配列を反復思います。

関連する問題