- ActiveReco
rd の TC/TT アダプタ - AR 上で動作するので全てのAPIが利用可能
インストール
1 % gem install activetokyocabinet
サーバの起動
1 % ttserver -port 11114 db.tct &
- ポート(11114)は何でもよい
- ファイル名も何でもよい (拡張子はtct)
セットアップ
1 require 'active_tokyocabinet/ tdb' 2 3 ActiveReco rd::Base.establish_ connection ( 4 :adapter => 'tokyotyran t', 5 :database => { 6 :englishes => {:host => 'localhost', :port => 11114}, 7 } 8 );
- adapter 名は 'tokyotyran
t' - database で利用するテーブル名と参照するTTの設定を指定する
- 以下で Englishモデルを使うので "englishes" を定義している
- 複数のモデルを使うときはやっぱりTTが複数必要?
使い方
1 class English < ActiveRecord::Base 2 include ActiveToky oCabinet::TDB 3 4 string :word 5 int :length 6 7 validates_ presence_o f :word, :length 8 9 def validate 10 self[:length] ||= word.to_s.size 11 end 12 end
- ARなので validate でも何でも思い通り
- カラム定義は string, int, float (date/datet
imeはない?)
1 # /usr/share/dict/word s を流し込み 2 buf = File.read("/usr/share /dict/word s") 3 buf.scan(/^([a-z]+)$/) { 4 English.create!(:word=>$1) 5 } 6 7 English.count 8 => 64024 9 10 English.all(:conditions =>["word regexp ? and length > ?", '^mai', 12]) 11 [#<English id: 33247, word: "mainstream ing", length: "13">, 12 #<English id: 33250, word: "maintainab ility", length: "15">]
- 正規表現の検索も可能
1 e = English.first 2 e.delete 3 ActiveRecord::StatementI nvalid: NoMethodEr ror: undefined method `values_at' for 1:Fixnum: DELETE FROM englishes WHERE (id IN (1)) 4 from /usr/lib/r uby/gems/1 .8/gems/ac tiverecord -2.3.5/lib /active_re cord/conne ction_adap ters/abstr act_adapte r.rb:219:i n `log'
あれ!?あれ?
まとめ
- ARで稼動する上に正規表現による検索も可能
- 削除(delete, destroy)ができないのはご愛嬌
で、一番驚いたのは、実装方法。 普通なら、ARの各メソッドをTT化していきそうなものだが、
- ARにSQLを作成させて
- そのSQLをパーズして
- TTに翻訳する
その発想はなかった。目から鱗です。 というか、SQLのparserは実用性が高いのでまず、 それをgem化希望!激しく希望!!
参考
posted by
maiha
on Fri 26 Feb 2010
at 01:35
with
2 comments
レポートありがとうございます。 削除できない件は修正しました。
SQLのparserはTC/TTに特化していていい加減なところが多いので(ORが使えない・JOINが使えない・サブクエリが使えない等々)、正直、あんまり汎用性はないと思います
なるほど。rails のログから実行したクエリを抜き出したいと思うことがよくありまして。
あ、削除は確認できましたっ!!あざーす♪