filemaker-ruby
filemaker-ruby
とは Ruby で FileMaker XML API を扱うための gem です。以下がリポジトリになります。
https://github.com/mech/filemaker-ruby
filemaker-ruby を Ruby on Rails で使う
filemaker-ruby
は単体の Ruby で用いることができますが、Rails でも用いることができます。ただ、その際にいくつかの注意点があり、公式ドキュメント では分かりにくい部分かもしれませんのでまとめておきます。
準備
config/filemaker.yml を用意する
config/filemaker.yml
を用意します。このファイルが無い場合は rails コマンドが失敗してコンソールやサーバが起動しません。要件さえ満たしていればとりあえずハリボテでも構いません。
ハリボテの場合の config/filemaker.yml
は以下のとおりです。
development:
default:
host: foobar
account_name: foo
password: bar
config/database.yml
とほぼ同じ書式です。実行環境名が一番上の階層に来て、その下には任意の設定名が来ます。任意の設定名として default
と命名していますが、これは自由に変更して構いません。後ほど呼び出し時に指定する名称です。
設定を正式に書く場合は account_name
や password
は環境変数から呼び出すのが良いでしょう。
Rails の中で Filemaker オブジェクトを作る
config/filemaker.yml
を正しく配置できたならば Filemaker
クラスのオブジェクトを以下のように作ることができます。ここで default
は config/filemaker.yml
内で記述した名称です。
fm_client = Filemaker.registry['default']
生成したオブジェクトを取り扱う
オブジェクトが生成されたならあとはそれを操作するだけです。例えば以下のメソッドでは、次の条件を満たすレコードを返します。
- データベース名が
my_database
- レイアウト名が
my_layout
- 上記のデータベース&レイアウトの中で、「foo」というフィールドが「bar」であるレコード(完全一致)
records = fm_client.database['my_database'].layout['my_layout'].query({ 'foo': '==bar' })
返されるレコードは複数(Filemaker::Resultset クラスのオブジェクト)です。あとは each
なり map
なりでそれを取り扱ってあげればよいです。
発展
いくつか発展的な事項を付記しておきます。
1. 日本語環境ではエラーメッセージのエンコードに失敗して例外を吐くことがある
具体的には私が出しているプルリクエストを見ていただきたいのですが、日本語(というか非アルファベット)環境ですと、一定のエラーメッセージを吐き出すときにエンコードに失敗し例外を吐いて止まってしまいます。
このエラーメッセージは Ruby のエラーメッセージではなく、filemaker-ruby
が生成しているエラーメッセージです。
私が出したプルリクエストではこのメッセージを強制的に UTF-8 に変換することで例外を吐くことを回避しています。日本語環境ではこの点に留意しておいたほうがいいでしょう。
2018年10月10日現在、まだマージされていませんので、適切に対処してください。
2. Sidekiq のジョブで実行するとメモリを食いつぶす
Sidekiq のジョブとして filemaker-ruby
を用いると、その実行周期が短い場合(だいたい1秒毎ぐらい)にはメモリを食いつぶしてマシンがフリーズします。
これは Sidekiq の Wiki に書いてあるように、filemaker-ruby
が typhoeus
という gem を使っているのが原因です(下記)。
https://github.com/mech/filemaker-ruby/blob/master/filemaker.gemspec#L21
この点にも留意しておく必要があります。