2012-03-02 2 views
0

다음과 같은 방법으로 정상적으로 작동합니다. 그러나, 나는 그것이 추한 것 같아요. 저는 PHP 세계에서 왔고 Ruby를 배우는 중입니다. 이 방법을 쓰는 더 좋은 방법이 있습니까?Ruby DBI 행을 직접 수정하십시오.

def _get_tasks(project_id) 
    _tasks = $dbh.select_all("SELECT * FROM tasks WHERE project_id=? ORDER BY name ASC;",project_id) 
    tasks = [] 
    _tasks.each do |t| 
     _t = t.to_h 
     _t[:log] = $dbh.select_all("SELECT * FROM log WHERE task_id=? ORDER BY start DESC;",t[:task_id]) 
     tasks.push _t 
    end 
    return tasks 
end 

내 최초의 생각 (희망)은 다음과 겠지만, 작업 배열의 분명히 요소가 해시하지만 DBI 실제로하지 않기 때문에 그것은 잘못된 것입니다 : 행 객체. 어떤 포인터?

def _get_tasks(project_id) 
    tasks = $dbh.select_all("SELECT * FROM tasks WHERE project_id=? ORDER BY name ASC;",project_id) 
    tasks.each do |t| 
     t[:log] = $dbh.select_all("SELECT * FROM log WHERE task_id=? ORDER BY start DESC;",t[:task_id]) 
    end 
    return tasks 
end 
+0

왜 전역 변수를 사용합니까? 당신은 거의 필요하지 않습니다. 또한'row.by_field (: log)'를 시도해 보셨습니까? –

+0

전역 변수는 전체 프로그램을 통해 단일 데이터베이스 연결을 공유하는 것입니다. 그리고 "row.by_field (: log)'는"log "라는 컬럼이 없기 때문에 작동하지 않을 것이다. 특정 작업에 대한 로그 테이블의 행을 잡고 작업 테이블의 내 작업 해시 화살표로 추가하려고합니다. – jasonlfunk

+0

그럼이 코드가하는 일을 이해하지 못합니다. 아니요, DB 행은 해시가 아니며 DB 행입니다. 새로운 해시를 만들고, 정말로 필요하다면 이미했던 것처럼 (나는 의심 스럽다). 또한 전역 변수는 절대 필요하지 않습니다 *. 프로젝트를 별도의 모듈로 분할하고 여기에 DB 연결과 같은 종속성을 생성자 인수로 주입해야합니다. –

답변

1

글로벌 클래스 및 ORM 사용을 피하는 제안이 많습니다. 맞아,하지만 너를 위해 고쳐주지 않을거야. 이 함수가 단지 더 예쁘고보다 관용적 인 루비가되기를 원한다면, 추악한 밑줄과 임시 변수를 모두 버리고 열거 형을 사용하십시오.

def get_tasks project_id 

    task_sql = "SELECT * FROM tasks WHERE project_id=? ORDER BY name ASC;" 
    log_sql = "SELECT * FROM log WHERE task_id=? ORDER BY start DESC;" 

    $dbh.select_all(task_sql, project_id). 
    map(&:to_h). 
    map do |task| 
    task.merge :logs => $dbh.select_all(log_sql, task[:task_id]).map(&:to_h) 
    end 

end 
+0

실제로 내 질문에 답변 해 주셔서 감사합니다. :) – jasonlfunk

관련 문제