プロジェクト

全般

プロフィール

GuideModel » 履歴 » バージョン 1

Mitsuyoshi Yoshida, 2011/06/25 23:30

1 1 Mitsuyoshi Yoshida
2
h1. モデルのスケルトンの生成
3
4
MVC のうち、 Model をまず作っていきましょう。
5
プラグインのスケルトン作成と同様にモデルにもスケルトン作成機能があります。
6
7
8
h2. データベース
9
10
モデルはデータベースを扱うものです。ここで簡単にデータベースの説明をしておきます。
11
データの一つ一つは *レコード* と呼ばれます。チケットでいうと一つのチケットがレコードになります。
12
データの要素は *カラム* と呼びます。チケットでは「題名」、「トラッカー」、「説明」などがそれにあたります。
13
このレコードは *テーブル* に格納されます。
14
データベースはこのテーブルを複数持ちます。 redmine のデータベースではチケットのテーブル、文書のテーブルといった複数のテーブルを持っています。この redmine のデータベースの中に今回プラグイン用のテーブルを新たに作成することになります。
15
16
17
h2. モデルの名前とデータ構成を決める
18
19
まず、モデルを作成するにはモデルの名前を決めておく必要があります。
20
[[GuideSampleSpec|サンプルの仕様]] で決めたデータは特に意味のないサンプル的なものにしました。そこでモデルの名前もよくサンプルで使われる *Foo* とします。
21
22
次にデータ構成を決める必要があります。すなわちデータがどのようなカラムを持つかということを決めることになります。
23
データの要素は *題名* と *説明* にしました。まず、データレコードにはこの 2 つのカラムが必要です。
24
これに加えて要素としては *プロジェクト ID* も必要になります。これはプラグインをプロジェクトごとで使用する場合に必要となります。プロジェクトごとのデータというと、ディレクトリのような入れ物の中にデータが格納されるイメージをもたれるかもしれません。しかし、実際には Foo のデータのテーブルは一つで、データの中にどのプロジェクトかという情報をいれたカラムを持たせ、現在のプロジェクトに一致したデータだけを表示するという方法で実現します。
25
26
これらのデータのカラムの名前と型を次のようにします。
27
28
|_. 要素          |_.  名前     |_. 型           |
29
| プロジェクト ID | project_id  | 整数(integer)  |
30
| 題名		  | subject       | 文字列(string) |
31
| 説明		  | description | 文字列(text)	 |
32
33
これ以外にも Rails では *id* というカラムを自動的に持ちます。これはデータを識別するための整数型で番号で、データベースにデータを追加する際にこのカラムに自動的に割り振られた番号が入力されます。
34
これと同様にプロジェクトも id を持っています。これを格納するのが project_id で、データの属するプロジェクトを表します。
35
subject には *string* 、description には *text* の文字列型を使用します。string 型には 256 文字という制限があるため、詳細表示用の description は text にしています。それならば subject も text にすればと思われるかもしれませんが、text は string に比べてデータベースの処理速度が遅くなってしまうため、string で済むものは string にしておいた方がいいでしょう。
36
37
38
h2. モデルスケルトンの生成
39
40
コントローラのスケルトンの実行コマンドの書式は次のような形です。
41
42
<pre>
43
$ ruby script/generate redmine_plugin_model プラグイン名 モデル名 [カラム名:型 ...]
44
</pre>
45
46
Redmine のトップディレクトリに移動して、決めた名前で実際にコマンドを実行します。
47
48
<pre>
49
$ ruby script/generate redmine_plugin_model Standard Foo project_id:integer subject:string description:text
50
</pre>
51
52
実行結果
53
<pre>
54
      exists  app/models/
55
      create  test/unit/
56
      create  test/fixtures/
57
      create  app/models/foo.rb
58
      create  test/unit/foo_test.rb
59
      create  test/fixtures/foos.yml
60
      exists  db/migrate
61
      create  db/migrate/20110612021254_create_foos.rb
62
</pre>
63
64
実行するとモデルの他にテスト用のコードと db/migrate 以下のファイルが作成されます。
65
66
67
h2. 生成された Migration 用のファイル
68
69
データを保存できるようにするにはデータベースにテーブルを作る必要があります。これは Migration と呼ばれる処理で行われ、インストールのときデータベースを作成したように rake で実行されます。
70
71
このときに使われるのが db/migrate/20110612021254_create_foos.rb です。
72
73
<pre><code class="ruby">
74
class CreateFoos < ActiveRecord::Migration
75
  def self.up
76
    create_table :foos do |t|
77
      t.column :project_id, :integer
78
      t.column :subject, :string
79
      t.column :description, :text
80
    end
81
  end
82
83
  def self.down
84
    drop_table :foos
85
  end
86
end
87
</code></pre>
88
89
Migration 時にテーブルを作成するメソッドと削除するメソッドがそれぞれ定義されています。
90
91
92
h2. Migration の実行
93
94
Rails のトップディレクトリで以下のコマンドを実行すると Migration が実行されます。
95
96
<pre>
97
$ rake db:migrate_plugins
98
</pre>
99
100
実行結果
101
<pre>
102
  :
103
Migrating open_id_authentication...
104
Migrating prepend_engine_views...
105
Migrating redmine_standard...
106
==  CreateFoos: migrating =====================================================
107
-- create_table(:foos)
108
   -> 0.0030s
109
==  CreateFoos: migrated (0.0030s) ============================================
110
111
Migrating rfpdf...
112
  :
113
</pre>
114
115
このとき実行されるのは vender/plugins 以下にあるすべてのプラグインです。
116
各プラグインでは db/migrate 以下にあるファイルを番号の小さいものから順に実行します。生成された Migration 用ファイルの先頭は日付から決められています。つまり日付の古い方から実行されることになります。
117
118
この Migration の処理は一度実行したファイルの番号を覚えています。先ほどと同じコマンドをもう一度実行してみてください。 Migration redmine_standard 以下で今度は何もしません。
119
120
プラグイン製作中にデータの構成を変更したくなった場合はもう一度 Model のスケルトンの生成をやり直すか、内容を修正してファイルの番号が大きくなるようにファイル名を変更する必要があります。このとき、すでにテーブルが作成済みの場合エラーとなるので、テーブルも削除しておく必要があります。
121
プラグインを公開した後などで、データ構成を変更したくなった場合はカラムの追加、削除といった修正内容を記述した Migration 用ファイルをテーブル作成ファイルよりもファイルの番号が大きくなるようなファイル名で作成します。
122
123
124
h2. 生成された Model のファイル
125
126
Model のファイル app/models/foo.rb を見てみましょう.
127
128
<pre><code class="ruby">
129
class Foo < ActiveRecord::Base
130
  unloadable
131
end
132
</code></pre>
133
134
2 行目に *unloadable* という見慣れないものがあると思いますが、これはおまじないのようなものだと思ってください。ただ、これを書いておかないと development モードで正常に動作しなくなります。
135
よく C の入門で使う Hello World のプログラムなどで最初 #include などをおまじないで説明して、後で詳しく説明したりしますが、これはただ書いてあればそれでよいので、おまじないのままでも十分です。詳しく知らないと落ち着かないという方はネットなどで調べてみてください。
136
137
後はシンプルです。 ActiveRecord モジュールの Base クラスを継承して Foo クラスを定義しているというだけです。Rails の Model クラスでは親クラスの ActiveRecord::Base がほとんどやってくれるので、あまりこちらに記述しなければならない内容はありません。といいつつ実は少し追加する必要があるので、それについては[[GuideNewAction|後で]]説明します。
138
139
Foo クラスの一つのインスタンスが一つのレコード情報に相当します。データの要素にもカラム名のアクセサメソッドでアクセスできます。 インスタンス名を foo とすると foo.subject や foo.description でアクセスできます。データベースからのデータの取得は Foo::find のようなクラスメソッドで行います。
140
141
142
h2. sqlite3 によるデータベースの操作
143
144
基本的に Rails でデータベースの操作を行う場合、 rake で行いますが、先ほど説明したようにプラグイン製作中にデータベースのテーブルを削除したくなることはあります。そこでその方法だけ簡単に説明しておきます。
145
環境は[[GuideDevEnv|開発環境の準備]]のところで用意したとおりのものとして、sqlite3 の場合について説明します。操作にはコマンドラインで実行する splite3.exe プログラムを使用します。インストールされていない場合はインストールしておいてください。 
146
147
h3. データベースを開く
148
149
config/database.yml の設定でデータベースファイルを db/redmine.db としました。まず、このファイルをオープンします。
150
151
<pre>
152
$ splite3.exe db/redmine.db
153
</pre>
154
155
実行すると *splite>* のプロンプトになります。ここで操作用のコマンドを実行します。
156
157
ヘルプと終了は次のコマンドです。
158
159
<pre>
160
sqlite> .help
161
sqlite> .quit
162
</pre>
163
164
h3. テーブルの表示と削除
165
166
次のコマンドでテーブルの一覧が表示されます。
167
168
<pre>
169
sqlite> .tables
170
</pre>
171
172
そこで削除したいテーブルを探します。ここでは foos がそれにあたります。
173
そのテーブル名で削除用の SQL 文を実行します。ピリオド(.)で始まっているのは splite 用のコマンドですが、テーブルの削除は SQL 文なので、最後に ; が必要です。
174
175
<pre>
176
sqlite> drop table foos;
177
</pre>
178
179
180
splite3.exe でデータベースファイルの後に SQL 文を書くことで、コマンドプロンプトに入らずにテーブルを削除することも出来ます。
181
182
<pre>
183
$ splite3.exe db/redmine.db "drop table foos;"
184
</pre>
185
186
187
h3.  テーブルをもう一度作る
188
189
テーブルを消したので、もう一度作成する方法も説明しておきます。 
190
そのまま migrateion を実行しても先ほど書いたように何もしてくれません。db/migrate のファイルの番号を大きくしてもう一度 rake db:migrate_plugins のコマンドを実行してください。
191
192
20110612021254_create_foos.rb
193
194
20110612021255_create_foos.rb
195
196
197
198
199
---
200
201
| [[プラグイン開発ガイド|^]] | [[GuideInitRb|<<]] | [[GuideControlSkelton|>>]] |