2012-03-02 74 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)'? – 2012-03-02 23:21:57

+0

全局变量是通过整个程序共享一个数据库连接。而'row.by_field(:log)'将不起作用,因为没有名为“log”的列。我试图从日志表中获取特定任务的行,并将它们作为箭头添加到任务表中的任务哈希中。 – jasonlfunk 2012-03-02 23:55:04

+0

那么我不明白这段代码是干什么的。不,数据库行不是散列,它是数据库行。只要创建一个新的散列,并且像你已经做过的,如果你真的需要(我怀疑)。另外,全局变量从不需要*。你应该将你的项目拆分成不同的模块,并将依赖关系(如DB连接)作为构造函数参数注入真正需要它们的对象中。 – 2012-03-02 23:57:51

回答

1

所以有一堆评论建议你避免全局和使用类或ORM。他们是对的,但我不会为你解决这个问题。如果你只是想让这个函数变得更“漂亮”,更具惯用意义的ruby,请删除所有丑陋的下划线和临时变量并使用枚举。

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 2012-03-15 14:34:03