気づいたら、ここだった

考えているようで、考えなしに生きてるので、気づいたらこんなことになてってた私のブログ

a-blog cms のデータを ruby で触ってみるの巻

あのさ、a-blog cms のデータを取り出したりするの、みんなどうやってんの?
ぼくはphpMyAdminとか最近使い始めたSequel Proとか、もういっそmysqlコマンドでとかやってんだけど、rubyActiveRecord使って対話的に操作できたら楽なんじゃないかとおもってちょっと試してたんですよ。
それで、今までgemを作った事が無かったので、せっかくだからその勉強もかねてgemにまとめて公開してみようかと思いたって、なんとなく動くとこまで書いたので公開することにしましたよ。

公開からこの記事までのタイムラグはいろいろいそがしくて、ときどき書いてたので。やっと書いた。

acms_ruby

こちらでソース公開してます
majosystems/acms_ruby · GitHub

インストール

$ gem install acms_ruby

で入ると思います。たぶん。ぼくやったことないけど。

起動

インストールが成功したら acms ってコマンドが使えるようになるよ。
このコマンドは a-blog cms がインストールされているディレクトリで実行してね。
それはつまり、config.server.phpってファイルが置かれているディレクトリだ。
なぜなら、acmsコマンドは、そのファイルのDB接続情報を読んで接続するからだよ。

$ acms

ところで、DB接続について。
ローカルにインストールされている場合、MySQLのポートの設定が無くてphpのdefautなんとかってとこからソケット情報を取ってきたりしているらしい。
acmsはそんなことわかってないからエラーが出るね。出るよね。出ちゃうよね。
そんな時は環境変数 ACMS_SOCKET にソケットのファイルを書いておいてくれれば、それを頼りに接続するよ。
ぼくのMAMPだとこんな感じ。

export ACMS_SOCKET='/Applications/MAMP/tmp/mysql/mysql.sock'

ずっと使うなら .bashrc にでも書き加えてね。

使い方

起動するとプロンプトが出る。

  acms_ruby ver.0.1.0

[1] pry(AcmsRuby)>

これで準備完了。やってることはモデルクラスを読み込んでpryを起動しているだけ。
そこで対話的にデータを参照できるよ。みんなどういう使い方するのかなぁ。
例えば、あるカテゴリに属してるエントリーだけ一覧で見たいと思ったときは

> category = Category.find 1

これで category って変数に category_id が 1 のカテゴリ情報がロードされた。

> category.entries.map(&:title)
=> ["事務職", "技術職", "営業職"]

カテゴリーに所属しているエントリーはentriesってメソッドで取り出せる。
そのtitleだけを配列で返してもらったのが上の書き方。
mapは配列に対するメソッドだから、ruby使う人はわかるとおもうので割愛。
あとはrubyのプログラムとして、ActiveRecordオブジェクトの操作方法がわかればだいたいそのままのの使い方で使えると思うよ!
ユーザーは User、ブログはBlog、エントリーはEntryってモデルクラスがあります。
それぞれリレーションがあるので、例えばさっきのカテゴリ所属のエントリーをCSVで出力したい場合

> category.entries.each do |entry| print "#{entry.user.name},#{entry.category.name},#{entry.id},#{entry.title}\n"
管理人,採用情報,5,事務職
管理人,採用情報,6,技術職
管理人,採用情報,15,営業職

のように好きな値を取り出せる。
ユーザーを指定して、そのユーザーが持ってるエントリーの一覧だとこんな感じ

> user = User.find 1
> user.entries.each do |entry| print "#{entry.id},#{entry.title},#{entry.full_text.size}\n" end
1,カスタムフィールドのサンプルです,311
2,カスタムフィールドグループのサンプル,316
3,段組のテスト,905
4,ユニットによる要素の掲載例,1478
5,事務職,267
6,技術職,248
7,家庭用製品A,236
8,家庭用製品C,275
 ・
 ・
 ・

full_text はテキストユニットをぜんぶ繋げたものが帰ってきます。要は本文ね。sizeでその本文テキストの文字数を返してる。
あ、エントリーのリストを取り出す時はスコープが設定されていて、

> user.entries.drafts

のようにするとdraft(下書き)のエントリーだけを取り出したりできるよ。公開しているものはopens、非公開はclosesだよ。
これは別の書き方をすると、

> user.entries.where(entry_status: :draft)

と同じね。
whereを使う場合はDBのカラム名をちゃんと調べとかないとわかんない。
どんなクエリが出てるかみたかったら最後に .to_sql ってつけたらいいよね。このあたりもActiveRecordそのまま。
更新もActiveRecord知ってる人ならそのままなんだけど、エントリーの公開設定とかは簡単なメソッド用意したので照会しとく。

> user.entries.each do |entry| entry.close! end

これでこのユーザーの全エントリーが一瞬で非公開になるよ。
戻す時は open! ね。
こんな感じで、ActiveRecordとpryとか使ってる人なら、ちょっとはa-blog cmsのデータを取り出すのが楽になるかな?と思って用意したので、こんなんでも役に立つなら使ってみてね。

注意!

a-blog cms公式のツールじゃないから、これで問題が起きても文句言うところないから!
ぼくも自分で使いたい機能を実装してみただけなので、まだまだ足りてない機能とか、なんかとんでもない勘違いな実装とかしてるかもしれないので、過信しないようにね。
ローカルテスト環境とかをサクサクいじりたい時のツールだと思ってくださいな。
あと、要望もあればぜひどうぞ。