Изменить строку Ruby DBI напрямую - PullRequest
0 голосов
/ 03 марта 2012

У меня есть следующий метод, который отлично работает.Тем не менее, я думаю, что это некрасиво.Я из мира PHP и только изучаю Ruby.Есть ли лучший способ написать этот метод?

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

1 Ответ

1 голос
/ 15 марта 2012

Так что есть куча комментариев, предлагающих вам избегать глобальных и использовать классы или 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
...