activerecord-orale_enhanced-
       adapterのご紹介
      今井(   田)尚人(@elcondor)
自己紹介
Ruby歴=Rails歴=3年半くらい

JRuby歴=半年ちょこっと

好きなメソッドはModule#included,
Class#class_eval
JRubyで日本語Cucumberを動くように
しました
本日のまとめ

RailsでOracleを使う場合は、
activerecord-oracle_enhanced-adapterが
オススメ
OracleでRails?
オープンレガシーな企業情報システムと
いえば、DBはOracleのことが多い
→既存システムを活かしたままRailsを使う
なら、RailsもOracleに直接つなぐのが楽

JRubyは、オープンレガシーとの協調、という文
脈で扱われることが多いので、OracleでRailsと
いうのも真剣に考えておいて損はない(多分)
What’s oracle_enhaced?

 Oracle Databaseと繋げます(当たり前)


 MRIでもJRubyでも使えます


 痒いところに手が届いてます
痒いところに手が届く?
例えばこんな場合
class	 CreateUsers	 <	 ActiveRecord::Migration
	 	 def	 self.up
	 	 	 	 create_table	 :users	 do	 |t|
	 	 	 	 	 	 ...
	 	 	 	 	 	 t.date	 :start_on,	 :null	 =>	 false
	 	 	 	 	 	 t.date	 :end_on
	 	 	 	 	 	 t.datetime	 :last_logged_at
	 	 	 	 	 	 ...
	 	 	 	 end
	 	 end

	 	 ...
end
start_on/end_onは日付、last_logged_atは日時
DB定義は...
    Column          Type   Size
             ....
   START_ON         DATE    7
    END_ON          DATE    7
LAST_LOGGED_AT      DATE    7
            ....
             .
DB定義は...
     Column          Type   Size
              ....
    START_ON      DATE       7
     END_ON       DATE       7
 LAST_LOGGED_AT   DATE       7
             ....
              .
日付も日時も、OracleならDATE型
どう困る?
irb(main):001:0>	 User.create!(:name	 =>	 'さんぷる',
	 	 :login	 =>	 'sample',	 :password	 =>	 'password',
	 	 :start_on	 =>	 Date.current)
=>	 #<User	 id:	 10001,	 name:	 "さんぷる",
	 	 login:	 "sample",	 password:	 "password",
	 	 start_on:	 "2010-12-25	 15:00:00",	 end_on:	 nil,
	 	 last_logged_at:	 nil,	 description:	 nil,
	 	 created_at:	 "2010-XX-XX	 XX:XX:XX",	 
	 	 updated_at:	 "2010-XX-XX	 XX:XX:XX">
どう困る?
irb(main):001:0>	 User.create!(:name	 =>	 'さんぷる',
	 	 :login	 =>	 'sample',	 :password	 =>	 'password',
	 	 :start_on	 =>	 Date.current)
=>	 #<User	 id:	 10001,	 name:	 "さんぷる",
	 	 login:	 "sample",	 password:	 "password",
	 	 start_on:	 "2010-12-25	 15:00:00",	 end_on:	 nil,
	 	 last_logged_at:	 nil,	 description:	 nil,
	 	 created_at:	 "2010-XX-XX	 XX:XX:XX",	 
	 	 updated_at:	 "2010-XX-XX	 XX:XX:XX">


Dateで取り扱いたいカラムがTimeに
マッピングされて困る
そこで
oracle_enhanced-adapter
       ですよ
まずはdatabase.yml
development:
	 	 adapter:	 oracle_enhanced
	 	 uri:	 jdbc:oracle:thin:@host:1521:xe
	 	 connection_alive_sql:	 ‘select	 1	 from	 dual’
まずはdatabase.yml
development:
	 	 adapter:	 oracle_enhanced
	 	 uri:	 jdbc:oracle:thin:@host:1521:xe
	 	 connection_alive_sql:	 ‘select	 1	 from	 dual’


adapterにoracle_enhancedを指定
モデルクラスの実装

class	 User	 <	 ActiveRecord::Base
	 	 set_date_columns	 :start_on,	 :end_on
	 	 ...
end
モデルクラスの実装

 class	 User	 <	 ActiveRecord::Base
 	 	 set_date_columns	 :start_on,	 :end_on
 	 	 ...
 end



set_date_columnsで日付扱いするカラムを
指定
それでどうなった?
irb(main):006:0>	 User.create!(
	 	 :name	 =>	 'さんぷる',:login	 =>	 'sample',
	 	 :password	 =>	 'password',
	 	 :start_on	 =>	 Date.current)
=>	 #<User	 id:	 10002,	 name:	 "さんぷる",
	 	 login:	 "sample",	 password:	 "password",
	 	 start_on:	 "2010-12-25",	 end_on:	 nil,
	 	 last_logged_at:	 nil,	 description:	 nil,
	 	 created_at:	 "2010-12-25	 22:18:58",
	 	 updated_at:	 "2010-12-25	 22:18:58">
それでどうなった?
irb(main):006:0>	 User.create!(
	 	 :name	 =>	 'さんぷる',:login	 =>	 'sample',
	 	 :password	 =>	 'password',
	 	 :start_on	 =>	 Date.current)
=>	 #<User	 id:	 10002,	 name:	 "さんぷる",
	 	 login:	 "sample",	 password:	 "password",
	 	 start_on:	 "2010-12-25",	 end_on:	 nil,
	 	 last_logged_at:	 nil,	 description:	 nil,
	 	 created_at:	 "2010-12-25	 22:18:58",
	 	 updated_at:	 "2010-12-25	 22:18:58">
 set_date_columnsメソッドによって、
 日付型としての取り扱いを強制できた
それだけ?

他にも

命名規則で日付型かどうかを決めたり

文字列カラムをフラグに使えたりとか

細かく困りそうなところに手が届く
というわけで再まとめ

Oracleでハマりがちな罠を回避するのに、
activerecord-oracle_enhanced-adapterが役立
つので、ぜひ使いましょう

% (sudo) jruby -S gem install activerecord-
oracle_enhanced-adapter
終

activerecord-oracle_enhanced-adapterのご紹介

Editor's Notes

  • #2 &amp;#x4ECA;&amp;#x4E95;(&amp;#x3068;&amp;#x3088;&amp;#x3060;)&amp;#x3068;&amp;#x8A00;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\nTwitter&amp;#x3067;&amp;#x306F;@elcondor&amp;#x3067;&amp;#x3064;&amp;#x3076;&amp;#x3084;&amp;#x3044;&amp;#x3066;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n&amp;#x3088;&amp;#x308D;&amp;#x3057;&amp;#x304F;&amp;#x304A;&amp;#x306D;&amp;#x304C;&amp;#x3044;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n
  • #3 &amp;#x521D;&amp;#x767B;&amp;#x5834;&amp;#x306A;&amp;#x306E;&amp;#x3067;&amp;#x3001;&amp;#x300C;&amp;#x304A;&amp;#x524D;&amp;#x306F;&amp;#x4F55;&amp;#x8005;&amp;#x306A;&amp;#x3093;&amp;#x3060;&amp;#x300D;&amp;#x3068;&amp;#x601D;&amp;#x308F;&amp;#x308C;&amp;#x308B;&amp;#x65B9;&amp;#x304C;&amp;#x591A;&amp;#x3044;&amp;#x304B;&amp;#x3068;&amp;#x601D;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x306E;&amp;#x3067;&amp;#x3001;&amp;#x81EA;&amp;#x5DF1;&amp;#x7D39;&amp;#x4ECB;&amp;#x3092;&amp;#x7C21;&amp;#x5358;&amp;#x306B;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\nRuby&amp;#x6B74;&amp;#x3068;&amp;#x304B;JRuby&amp;#x6B74;&amp;#x306F;&amp;#x3001;&amp;#x3053;&amp;#x3053;&amp;#x306B;&amp;#x66F8;&amp;#x3044;&amp;#x305F;&amp;#x901A;&amp;#x308A;&amp;#x3067;&amp;#x3059;&amp;#x3002;\nJRuby&amp;#x30B3;&amp;#x30DF;&amp;#x30E5;&amp;#x30CB;&amp;#x30C6;&amp;#x30A3;&amp;#x3078;&amp;#x306E;&amp;#x8CA2;&amp;#x732E;&amp;#x3068;&amp;#x3057;&amp;#x3066;&amp;#x306F;&amp;#x3001;&amp;#x65E5;&amp;#x672C;&amp;#x8A9E;Cucumber&amp;#x3092;&amp;#x66F8;&amp;#x3051;&amp;#x308B;&amp;#x3088;&amp;#x3046;&amp;#x306B;&amp;#x3059;&amp;#x308B;&amp;#x3001;JRuby&amp;#x672C;&amp;#x4F53;&amp;#x3078;&amp;#x306E;&amp;#x30D1;&amp;#x30C3;&amp;#x30C1;&amp;#x3092;&amp;#x66F8;&amp;#x3044;&amp;#x305F;&amp;#x3001;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3068;&amp;#x3053;&amp;#x308D;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #4 &amp;#x3067;&amp;#x3001;&amp;#x3044;&amp;#x304D;&amp;#x306A;&amp;#x308A;&amp;#x4ECA;&amp;#x65E5;&amp;#x306E;&amp;#x307E;&amp;#x3068;&amp;#x3081;&amp;#x3067;&amp;#x3059;&amp;#x304C;&amp;#x3001;\nRails&amp;#x3067;oracle&amp;#x3092;&amp;#x4F7F;&amp;#x3046;&amp;#x5834;&amp;#x5408;&amp;#x306F;&amp;#x3001;activerecord-oracle_enhanced-adapter&amp;#x3092;&amp;#x4F7F;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x3087;&amp;#x3046;&amp;#x3001;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3053;&amp;#x3068;&amp;#x306B;&amp;#x306A;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  • #5 Oracle&amp;#x3067;Rails?&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x5411;&amp;#x304D;&amp;#x3082;&amp;#x3042;&amp;#x308B;&amp;#x304B;&amp;#x3068;&amp;#x601D;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x304C;&amp;#x3001;&amp;#x306A;&amp;#x3093;&amp;#x3060;&amp;#x304B;&amp;#x3093;&amp;#x3060;&amp;#x3067;&amp;#x4F7F;&amp;#x3046;&amp;#x5C40;&amp;#x9762;&amp;#x306F;&amp;#x591A;&amp;#x3044;&amp;#x3088;&amp;#x3046;&amp;#x306B;&amp;#x601D;&amp;#x3046;&amp;#x306E;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\nJRuby&amp;#x306F;&amp;#x7279;&amp;#x306B;&amp;#x3001;&amp;#x30AA;&amp;#x30FC;&amp;#x30D7;&amp;#x30F3;&amp;#x30EC;&amp;#x30AC;&amp;#x30B7;&amp;#x30FC;&amp;#x3001;&amp;#x4F8B;&amp;#x3048;&amp;#x3070;EJB&amp;#x30A2;&amp;#x30D7;&amp;#x30EA;&amp;#x306A;&amp;#x3093;&amp;#x304B;&amp;#x3068;&amp;#x306E;&amp;#x9023;&amp;#x643A;&amp;#x3001;&amp;#x307F;&amp;#x305F;&amp;#x3044;&amp;#x306A;&amp;#x6587;&amp;#x8108;&amp;#x3067;&amp;#x6271;&amp;#x308F;&amp;#x308C;&amp;#x308B;&amp;#x3053;&amp;#x3068;&amp;#x304C;&amp;#x591A;&amp;#x3044;&amp;#x3088;&amp;#x3046;&amp;#x306B;&amp;#x601D;&amp;#x3046;&amp;#x306E;&amp;#x3067;&amp;#x3001;\n
  • #6 &amp;#x3067;&amp;#x3001;&amp;#x3058;&amp;#x3083;&amp;#x3042;oracle_enanced&amp;#x3063;&amp;#x3066;&amp;#x4F55;&amp;#x306A;&amp;#x306E;&amp;#x304B;?&amp;#x3063;&amp;#x3066;&amp;#x3053;&amp;#x3068;&amp;#x306B;&amp;#x306A;&amp;#x308B;&amp;#x3093;&amp;#x3067;&amp;#x3059;&amp;#x304C;&amp;#x3001;Oracle&amp;#x306B;&amp;#x7E4B;&amp;#x3052;&amp;#x308B;&amp;#x306E;&amp;#x306F;&amp;#x5F53;&amp;#x7136;&amp;#x3068;&amp;#x3057;&amp;#x3066;&amp;#x3001;MRI&amp;#x3067;&amp;#x3082;JRuby&amp;#x3067;&amp;#x3082;&amp;#x540C;&amp;#x69D8;&amp;#x306B;&amp;#x4F7F;&amp;#x3048;&amp;#x307E;&amp;#x3059;&amp;#x3002;MRI&amp;#x3067;&amp;#x306F;ruby-oci8&amp;#x306B;&amp;#x3001;JRuby&amp;#x3067;&amp;#x306F;JDBC oracle driver&amp;#x306B;&amp;#x4F9D;&amp;#x5B58;&amp;#x3059;&amp;#x308B;&amp;#x8A33;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n&amp;#x305D;&amp;#x308C;&amp;#x304B;&amp;#x3089;&amp;#x6700;&amp;#x5927;&amp;#x306E;&amp;#x7279;&amp;#x5FB4;&amp;#x3067;&amp;#x3059;&amp;#x304C;&amp;#x3001;&amp;#x300C;&amp;#x75D2;&amp;#x3044;&amp;#x3068;&amp;#x3053;&amp;#x308D;&amp;#x306B;&amp;#x624B;&amp;#x304C;&amp;#x5C4A;&amp;#x3044;&amp;#x3066;&amp;#x308B;&amp;#x300D;&amp;#x3093;&amp;#x3067;&amp;#x3059;&amp;#x3002;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x308F;&amp;#x3051;&amp;#x3067;&amp;#x3001;\n
  • #7 &amp;#x75D2;&amp;#x3044;&amp;#x3068;&amp;#x3053;&amp;#x308D;&amp;#x306B;&amp;#x624B;&amp;#x304C;&amp;#x5C4A;&amp;#x304F;&amp;#x3063;&amp;#x3066;&amp;#x3069;&amp;#x3046;&amp;#x3044;&amp;#x3046;&amp;#x3053;&amp;#x3068;&amp;#x3088;?&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3053;&amp;#x3068;&amp;#x304C;&amp;#x4ECA;&amp;#x65E5;&amp;#x306E;&amp;#x672C;&amp;#x984C;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n&amp;#x524D;&amp;#x7F6E;&amp;#x304D;&amp;#x9577;&amp;#x3044;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #8 &amp;#x4F8B;&amp;#x3048;&amp;#x3070;&amp;#x3001;&amp;#x3053;&amp;#x3093;&amp;#x306A;&amp;#x30B3;&amp;#x30FC;&amp;#x30C9;&amp;#x3092;&amp;#x8003;&amp;#x3048;&amp;#x3066;&amp;#x307F;&amp;#x307E;&amp;#x3057;&amp;#x3087;&amp;#x3046;&amp;#x3002;\nstart_on&amp;#x3068;end_on&amp;#x306F;&amp;#x65E5;&amp;#x4ED8;&amp;#x578B;&amp;#x3001;last_logged_at&amp;#x306F;&amp;#x65E5;&amp;#x6642;&amp;#x578B;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #9 &amp;#x3067;&amp;#x3082;&amp;#x3001;Oracle&amp;#x3067;&amp;#x306F;&amp;#x3069;&amp;#x3061;&amp;#x3089;&amp;#x3082;&amp;#x3001;&amp;#x533A;&amp;#x5225;&amp;#x305B;&amp;#x305A;DATE&amp;#x3068;&amp;#x3057;&amp;#x3066;&amp;#x53D6;&amp;#x308A;&amp;#x6271;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x3053;&amp;#x308C;&amp;#x304C;&amp;#x3069;&amp;#x3046;&amp;#x3044;&amp;#x3046;&amp;#x3053;&amp;#x3068;&amp;#x3092;&amp;#x5F15;&amp;#x304D;&amp;#x8D77;&amp;#x3053;&amp;#x3059;&amp;#x304B;&amp;#x3001;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3068;...\n
  • #10 &amp;#x7AEF;&amp;#x7684;&amp;#x306B;&amp;#x8A00;&amp;#x3048;&amp;#x3070;&amp;#x3001;Ruby&amp;#x3067;&amp;#x306F;Date&amp;#x3068;&amp;#x3057;&amp;#x3066;&amp;#x6271;&amp;#x3044;&amp;#x305F;&amp;#x3044;&amp;#x30AB;&amp;#x30E9;&amp;#x30E0;&amp;#x304C;&amp;#x3001;&amp;#x52DD;&amp;#x624B;&amp;#x306B;Time&amp;#x306B;&amp;#x3055;&amp;#x308C;&amp;#x3066;&amp;#x56F0;&amp;#x3063;&amp;#x305F;&amp;#x308A;&amp;#x3059;&amp;#x308B;&amp;#x8A33;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #11 &amp;#x3053;&amp;#x3053;&amp;#x3067;oracle_enhanced-adapter&amp;#x306E;&amp;#x767B;&amp;#x5834;&amp;#x3068;&amp;#x306A;&amp;#x308B;&amp;#x308F;&amp;#x3051;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #12 &amp;#x307E;&amp;#x305A;&amp;#x306F;&amp;#x3001;database.yml&amp;#x306E;&amp;#x8A2D;&amp;#x5B9A;&amp;#x3092;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n&amp;#x3068;&amp;#x3044;&amp;#x3063;&amp;#x3066;&amp;#x3082;&amp;#x3001;adapter&amp;#x3092;&amp;#x5909;&amp;#x3048;&amp;#x308B;&amp;#x4EE5;&amp;#x5916;&amp;#x306B;&amp;#x306F;&amp;#x4F55;&amp;#x3082;&amp;#x5909;&amp;#x3048;&amp;#x306A;&amp;#x304F;&amp;#x3066;OK&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  • #13 &amp;#x3064;&amp;#x3044;&amp;#x3067;&amp;#x3001;&amp;#x30E2;&amp;#x30C7;&amp;#x30EB;&amp;#x30AF;&amp;#x30E9;&amp;#x30B9;&amp;#x306B;set_date_columns&amp;#x3059;&amp;#x308B;&amp;#x3053;&amp;#x3068;&amp;#x3067;&amp;#x3001;&amp;#x65E5;&amp;#x4ED8;&amp;#x6271;&amp;#x3044;&amp;#x3059;&amp;#x308B;&amp;#x30AB;&amp;#x30E9;&amp;#x30E0;&amp;#x3092;&amp;#x6307;&amp;#x5B9A;&amp;#x3059;&amp;#x308B;&amp;#x3093;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #14 &amp;#x3068;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3001;&amp;#x3053;&amp;#x3046;&amp;#x306A;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x65E5;&amp;#x4ED8;&amp;#x578B;&amp;#x3068;&amp;#x3057;&amp;#x3066;&amp;#x8A2D;&amp;#x5B9A;&amp;#x3057;&amp;#x305F;&amp;#x5024;&amp;#x304C;&amp;#x3001;&amp;#x65E5;&amp;#x4ED8;&amp;#x578B;&amp;#x3068;&amp;#x3057;&amp;#x3066;&amp;#x53D6;&amp;#x308A;&amp;#x51FA;&amp;#x305B;&amp;#x3066;&amp;#x3044;&amp;#x308B;&amp;#x306E;&amp;#x304C;&amp;#x308F;&amp;#x304B;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #15 &amp;#x4ED6;&amp;#x306B;&amp;#x3082;&amp;#x3001;&amp;#x547D;&amp;#x540D;&amp;#x898F;&amp;#x5247;&amp;#x4F9D;&amp;#x5B58;&amp;#x306E;&amp;#x578B;&amp;#x6307;&amp;#x5B9A;&amp;#x3068;&amp;#x304B;&amp;#x3001;&amp;#x30D5;&amp;#x30E9;&amp;#x30B0;&amp;#x30AB;&amp;#x30E9;&amp;#x30E0;&amp;#x306B;&amp;#x6587;&amp;#x5B57;&amp;#x5217;&amp;#x30AB;&amp;#x30E9;&amp;#x30E0;&amp;#x3092;&amp;#x4F7F;&amp;#x3048;&amp;#x305F;&amp;#x308A;&amp;#x3001;&amp;#x3068;&amp;#x304B;&amp;#x3001;\n&amp;#x7D30;&amp;#x304B;&amp;#x304F;&amp;#x56F0;&amp;#x308A;&amp;#x305D;&amp;#x3046;&amp;#x306A;&amp;#x3068;&amp;#x3053;&amp;#x308D;&amp;#x306B;&amp;#x624B;&amp;#x304C;&amp;#x5C4A;&amp;#x3044;&amp;#x3066;&amp;#x3044;&amp;#x308B;&amp;#x3093;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  • #16 &amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x308F;&amp;#x3051;&amp;#x3067;&amp;#x307E;&amp;#x3068;&amp;#x3081;&amp;#x3002;\nOracle&amp;#x3067;&amp;#x30CF;&amp;#x30DE;&amp;#x308A;&amp;#x304C;&amp;#x3061;&amp;#x306A;&amp;#x7F60;&amp;#x3092;&amp;#x56DE;&amp;#x907F;&amp;#x3059;&amp;#x308B;&amp;#x70BA;&amp;#x3001;oracle_enhanced-adapter&amp;#x3092;&amp;#x4F7F;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x3087;&amp;#x3046;&amp;#x3002;\n
  • #17 \n