BP Study #15 ORマッパー対決〜2008 Active Recordとか
BP Study #15
ORマッパー対決〜2008
Active Recordとか
自己紹介
• 尾崎 智仁
• ID:yuroyoro
• フリーエンジニア
• Java、最近はScala
Blog
ORマッパー対決
ってことで
Active Record
ActiveRecordって?
•RailsでのO/R Mapper
•Railsなくてもつかえるけど
•ActiveRecordパターン
•Mapping定義が簡単
•class Member < ActiveRecord::Base
ActiveRecordって?
•DDL関係はMigrationで
•Act_as_*で振る舞いを拡張可能
•動的ファインダ
•Lazy Loading
•Named Scope ->イカス
やってみよう!
ActiveRecordを使う準備
•MySqlをインストールしておく
•MySqlにDatabaseを作っておく
•Railsアプリを生成する
•Migration書く
Railアプリを生成$ rails ARTestrails ARTestrails ARTestrails ARTest
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create config/initializers
create db
create doc
ActiveRecordを使う - 1
Modelを生成する
$ ./script/generate model ./script/generate model ./script/generate model ./script/generate model member username:string password:string¥ sex:decimal birthday:datetime last_login_time:timestamp
:0:Warning: Gem::SourceIndex#search support for Regexp patterns is deprecated
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/member.rb
create test/unit/member_test.rb
create test/fixtures/members.yml
create db/migrate
create db/migrate/20081127123415_create_members.rb
ActiveRecordを使う - 2
Migrateする
$ rake db:migraterake db:migraterake db:migraterake db:migrate
(in /Users/ozaki/dev/Project/sandbox/work/ARTest)
== 20081127123415 CreateMembers: migrating ====================================
-- create_table(:members)
-> 0.0049s
== 20081127123415 CreateMembers: migrated (0.0054s) ===========================
ActiveRecordを使う - 3
Consoleで確認$ script/console
Loading development environment (Rails 2.1.0)
>> member=Member.find(:all)>> member=Member.find(:all)>> member=Member.find(:all)>> member=Member.find(:all)
=> []
>> Member.create>> Member.create>> Member.create>> Member.create
#<Member id: 1, username: nil, password: nil, first_name: nil, last_name: nil, sex: nil, birthday: nil, last_login_time: nil, created_at: "2008-11-27 13:16:47", updated_at: "2008-11-27 13:16:47">
>> Member.find(1)>> Member.find(1)>> Member.find(1)>> Member.find(1)
=> #<Member id: 1, username: nil, password: nil, first_name: nil, last_name: nil, sex: nil, birthday: nil, last_login_time: nil, created_at: "2008-11-27 13:16:47", updated_at: "2008-11-27 13:16:47”>
ActiveRecordを使う - 4
動的な属性ベースのファインダ
>> Member.find_by_username('Test2')Member.find_by_username('Test2')Member.find_by_username('Test2')Member.find_by_username('Test2')
=> #<Member id: 2, username: "Test2", password: nil, first_name:nil, last_name: nil, sex: nil, birthday: nil, last_login_time: nil, created_at: "2008-11-27 13:17:04", updated_at: "2008-11-27 13:21:14">
ActiveRecordを使う - 5
関連の設定class Employee< ActiveRecord::Base
belongs_to :department
has_many :roles ,:through => :belongs
End
class Department< ActiveRecord::Base
has_many :employees
acts_as_tree :order => "id"
end
ActiveRecordを使う - 6
Named_scopeclass Member < ActiveRecord::Base
named_scope :male,
:conditions=>["sex = ?",1]
named_scope :recent,
lambda {|*args| {:conditions => ["updated_at > ?", args.first || 1.day.ago]} }
end
ActiveRecordを使う - 7
ActiveRecord まとめ
•Mapping定義は楽
•Pluginいっぱい
•Lazy Loading
•Irb上で簡単確認
よかったさがしよかったさがしよかったさがしよかったさがし
ActiveRecord まとめ
•リファクタリング大変
•Migrationは計画的に
•IDEの補完が…
•Joinとかにがて
DisDisDisDisってみるってみるってみるってみる
おまけActive Objects
ActiveObjectsって?
•ARパターンのJava実装
•Interfaceにgetter/setterで
•manager.migrate(Person.class);
•EntityManager
•アノテーション
•http://d.hatena.ne.jp/nattou_curry_2/
ご清聴ありがとう
ございました