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アプリケーションをすばやく構築するテクニック | |
株式会社クイープ オライリージャパン 2008-10-27 売り上げランキング : 32255 おすすめ平均 「Railsの外側」の問題解決の宝庫 Amazonで詳しく見る by G-Tools |