Rails
FileMaker

filemaker-ruby を Rails で使う場合のプラクティス

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_namepassword は環境変数から呼び出すのが良いでしょう。

Rails の中で Filemaker オブジェクトを作る

config/filemaker.yml を正しく配置できたならば Filemaker クラスのオブジェクトを以下のように作ることができます。ここで defaultconfig/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-rubytyphoeus という gem を使っているのが原因です(下記)。
https://github.com/mech/filemaker-ruby/blob/master/filemaker.gemspec#L21

この点にも留意しておく必要があります。