2016-06-01 1 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 (레일즈 2.x에서 작동하지 않는다), @stock.find (:all:order을 사용하지 않고 단지 :order을 사용하면 도움이되지 않는다), @stock.sort (효과 없음) 및 @stock.sort_by (효과 없음)을 시도했다. . 모든 코드는 컨트롤러 코드의 끝이나 뷰 코드의 @stock.each 바로 앞에 있습니다.

나는 특히 순서는 무작위입니다 당황하고 말해야한다 - 내가 이름을 주문하지 못하는 경우에도, 순서는 여전히 일관 될 것이라고 추정했을 것이다 ...

어떤 도움 것 대단히 감사하겠습니다!

+0

에 선

@stock.each{|name,values| 

을 변경? –

+0

네, 고맙습니다. @stock에서'.sort'와'.sort_by' 두 가지를 시도해 봤습니다 - 그 질문을 명확히하기 위해 업데이트하겠습니다. 나는 간단한 @ stock.sort를 시도했다.뿐만 아니라 '@stock.sort_by {| a | a [0]}'및'@ stock.sort {| a, b | b [: name] <=> [: name]}',이 사이트에서 발견 한 다른 답변을 기반으로합니다. 아무도 일하지 않았지만 물론 구문이 잘못되었을 수 있습니다. 특히 나는 @stock 배열의 구조와 색인을 완전히 이해하고 있다고 확신하지 못한다. – Phueal

+0

'@ 스톡 '은 배열이 아닙니다. Hash :'@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?)) 따라서 우리는 배열로 주문을 사용해야합니다. 정렬 된 해시 같은 것은있을 수 없습니다. 당신이 .sort 시도해 봤어보기에

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

감사합니다. 그러나 이것은 아무런 차이가 없습니다. 목록은 아직 분류되지 않았습니다. – Phueal

+0

"@stock"변수를 덤프하고 처음 3 행을 보내면 'puts @stock' – pshoukry

+0

덤프 시작은 다음과 유사합니다 (물론 더미 데이터) : { "Paracetamol (250mg)"=> { 영수증 "=> 10000.0,"처방 "=> 0,"분배 됨 "=> 0,"last_activity "=>"재고 있음 ","제거됨 "=> 0,"stock_at "=> 10000.0},"Paracetamol (1g) "="{영수증 "=> 10000.0,"처방 "=> 0,"분배 됨 "=> 0,"last_activity "=>"재고 있음 ","제거됨 "=> 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 = [] 

후, 약 이름을 수집하기 위해 빈 @stock_keys에게 배열을 만들 것 오른쪽 drug_id

에 대한 조회 한 후, 그 안에 약물 이름을 밀어 all_drugs에 반복의 끝에서
drug = Drug.find(drug_id) 
drug_name = drug.name 
@stock_keys << drug_name 
@stock[drug_name] = ... 

, 컨트롤러에, 나는 @stock_keys의 배열을 정렬 것

@stock_keys.sort! 

그런 다음보기에서, 나는 각각 검색의 @stock_keys 배열을 반복 거라고 난이 도움이 될 수 있습니다 희망 @stock 해시

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

에서 약물의 값을 단계.