モデルのテーブル名やプライマリキー名を指定する
そんな時に心強いのが、set_table_name です。
普通、モデル名の複数形がテーブル名になったりするのですが、モデルファイルで、set_table_name の後にテーブル名を指定してあげると、指定したテーブル名を使ってモデルが機能するようになります。
例を挙げてみましょう。
code_master という古ーいテーブルが昔からあったとします。
$mysql describe code_master;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| code_desc | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
それを、OldCodeMaster というモデルで使いたい!という場合は以下のように書けばOK牧場です。
app/models/old_code_master.rb
class OldCodeMaster < ActiveRecord::Base
set_table_name "code_master"
end
更に、テーブルには普通は id という名前の int 型のプライマリキーを付けるのですが、その名前が違うときには、set_primary_key を使います。
前述のテーブルの最初のカラムが id ではなくて、以下のように code_num というプライマリキーだった場合、
$mysql describe code_master;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| code_num | int(11) | NO | PRI | NULL | auto_increment |
| code_desc | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
次のように書けばOK牧場です。
app/models/old_code_master.rb
class OldCodeMaster < ActiveRecord::Base
set_table_name "code_master"
set_primary_key "code_num"
end
更に更に、あるカラムについて、データ内容は変えたくないけれど、モデルで新しい取り出し方や書き込み方をしたい場合は、メソッドを追加(オーバーライド?)します。
以下の例ですと、code_desc には、古いデータは全て小文字で入っているのですけど、今は全て大文字で読み書きしたい!でも、古いデータは小文字のまま残しておきたい!という場合の書き方です。
class OldCodeMaster < ActiveRecord::Base
set_table_name "code_master"
set_primary_key "code_num"
def code_desc # データの読み込み
read_attribute("code_desc").upcase
end
def code_desc=(code) # データの書き込み
write_attribute("code_desc", code.downcase)
end
end
【広告】