Redmineプラグイン開発 – データベースアクセスは超簡単

感想おまちしてます!

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}])