Redmine本体をみると、app/modelsにデータベースのテーブルに対応したDAOがあるので、それを利用するだけで簡単にデータベースにアクセスできる。
例えば、プロジェクトテーブルのデータが欲しいならProjectというDAOを使えばいいだけで、全件検索だと以下になる。
@projects = Project.find :all
プロジェクト名が欲しいなら、「project.name」とするだけ。name部分は、テーブルのカラム名に対応しているので、phpMyAdminでテーブルを調べながらやれば、簡単にデータを取得できてしまう。
検索条件を付ける場合
検索条件を付ける場合は、以下のように記述する。
project = Project.find(:first, :conditions => ["id = ?", @project_id])
この場合、条件が「id = @project_id」となる1個目のデータを取ってくる。
日時指定の場合
日時指定だと以下のようになる。
issues = Issue.find(:all, :conditions => ["start_date >= ? and due_date <= ?", @start_date, @due_date])
この場合、開始日時と終了日時にマッチするものを取得している。
ソートしたい場合
ソートしたい場合は以下のようにする。
@all_issues = Issue.find(:all, :conditions => ["start_date >= ? and due_date <= ? and assigned_to_id = ?", @start_date, @due_date, @assigned_to_id], :order => "start_date")
この場合、start_date順にソートできる。降順の場合は
:order => "start_date DESC"
でよいみたい。
countによる集計
ActiveRecordにはcountメソッドが付いているのでそれを使うだけ。戻り値は数値(int)っぽい。
Issue.count(:all, :conditions => ["fixed_version_id = ? and status_id =?", version_id, state.id])
SQLを書きたい
find_by_sqlメソッドで可能。
Issue.find_by_sql(["select start_date from issues where fixed_version_id = :version_id order by start_date asc limit 0, 1",
{:version_id => version_id}])
JOINとかも簡単にできる。
Issue.find_by_sql(
["select lastname, count(*) as count from issues, users where issues.assigned_to_id = users.id and fixed_version_id = :version_id group by assigned_to_id order by count desc",
{:version_id => version_id}])