DrySQLライブラリ (「実践Rails」4章 データベース)

ドライな野郎

DrySQLを使うと、モデルにvalidationを自前で書かなくてもスキーマ情報から自動生成してくれる。

こんなUsersテーブルがあって、

mysql> describe users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment | 
| name       | varchar(255) | NO   |     | NULL    |                | 
| old        | int(11)      | NO   |     | NULL    |                | 
| created_at | datetime     | YES  |     | NULL    |                | 
| updated_at | datetime     | YES  |     | NULL    |                | 
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
  class User < ActiveRecord::Base
  end

モデルにvalidationを書かないと

# ruby script/console     
Loading development environment (Rails 2.1.1)
>> u = User.new
=> #<User id: nil, name: nil, old: nil, created_at: nil, updated_at: nil>
>> u.name = 'gachapin'
=> "gachapin"
>> u.valid?
=> true
>> u.save!
ActiveRecord::StatementInvalid: Mysql::Error: Column 'old' cannot be null: INSERT INTO `users` (`name`, `updated_at`, `old`, `created_at`) VALUES('gachapin', '2008-12-08 15:30:36', NULL, '2008-12-08 15:30:36')

データベースからエラーになったりしますが、

config/environment.rbに一行追加すると

config.gem 'drysql'

スキーマ定義からvalidationがジェネレーティッドされました

Loading development environment (Rails 2.1.1)
>> u = User.new
DRYSQL >> Identified PRIMARY KEY for User: id
DRYSQL >> GENERATED VALIDATION: User validates_numericality_of :id, :allow_nil=>true, :only_integer=>true
DRYSQL >> GENERATED VALIDATION: User validates_nullability_of :name
DRYSQL >> GENERATED VALIDATION: User validates_length_of :name, :allow_nil=>true, :maximum=>255
DRYSQL >> GENERATED VALIDATION: User validates_nullability_of :old
DRYSQL >> GENERATED VALIDATION: User validates_numericality_of :old, :allow_nil=>true, :only_integer=>true
=> #<User id: nil, name: nil, old: nil, created_at: nil, updated_at: nil>
>> u.name = 'gachapin'
=> "gachapin"
>> u.valid?
=> false
>> u.save!
ActiveRecord::RecordInvalid: Validation failed: Old can't be null

関連も自動生成する

こんどはこんなテーブルをつくりました

mysql> describe messages;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment | 
| sentence   | text     | YES  |     | NULL    |                | 
| user_id    | int(11)  | YES  |     | NULL    |                | 
| created_at | datetime | YES  |     | NULL    |                | 
| updated_at | datetime | YES  |     | NULL    |                | 
+------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

Usersの子テーブルです。
外部キーを張ります。

mysql> alter table messages add foreign key (user_id) references users(id);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

モデルにはなんもかいてないです。

class Message < ActiveRecord::Base
end

これで

>> m = Message.new
DRYSQL >> Identified PRIMARY KEY for Message: id
DRYSQL >> GENERATED ASSOCIATION: Message belongs_to :user, :foreign_key=>user_id
DRYSQL >> GENERATED VALIDATION: Message validates_numericality_of :id, :allow_nil=>true, :only_integer=>true
DRYSQL >> GENERATED VALIDATION: Message validates_numericality_of :user_id, :allow_nil=>true, :only_integer=>true
=> #<Message id: nil, sentence: nil, user_id: nil, created_at: nil, updated_at: nil>

アソシエーションを自動生成した!
そして使える。

>> u.name = 'gachapin'
=> "gachapin"
>> u.old = 5
=> 5
>> m.sentence = 'みどり野郎'
=> "みどり野郎"  
>> u.messages << m
=> [#<Message id: nil, sentence: "みどり野郎", user_id: nil, created_at: nil, updated_at: nil>]
>> u.save!
=> true
>> u
=> #<User id: 1, name: "gachapin", old: 5, created_at: "2008-12-08 17:09:52", updated_at: "2008-12-08 17:09:52">
>> u.messages
=> [#<Message id: 1, sentence: "みどり野郎", user_id: 1, created_at: "2008-12-08 17:09:52", updated_at: "2008-12-08 17:09:52">]

そして例により、今のところはRails2.2.2では動かないのであった

# ruby script/console     
Loading development environment (Rails 2.2.2)
/opt/local/lib/ruby/gems/1.8/gems/drysql-0.2.2/lib/validations.rb:5:NameError: uninitialized class variable @@default_error_messages in ActiveRecord::Errors
>> u = User.new
=> #<User id: nil, name: nil, old: nil, created_at: nil, updated_at: nil>
>> u.name = 'gachapin'
=> "gachapin"
>> u.save!
ActiveRecord::StatementInvalid: Mysql::Error: Column 'old' cannot be null: INSERT INTO `users` (`name`, `updated_at`, `old`, `created_at`) VALUES('gachapin', '2008-12-08 15:33:56', NULL, '2008-12-08 15:33:56')
drysql (0.2.2)


実践 Rails -強力なWebアプリケーションをすばやく構築するテクニック
実践 Rails -強力なWebアプリケーションをすばやく構築するテクニック株式会社クイープ

オライリージャパン 2008-10-27
売り上げランキング : 32255

おすすめ平均 star
star「Railsの外側」の問題解決の宝庫

Amazonで詳しく見る
by G-Tools