FileMaker API for Ruby (ginjo-rfm) を初めて触る人のために

# FileMaker API for Ruby (ginjo-rfm) を初めて触る人のために
FileMaker API を Ruby を用いて扱える ginjo-rfm を利用するための、ごく基本的な方法を書いていきます。

# 環境
- Ubuntu 16.04.1 LTS
- ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

# インストール
まずは何はともあれインストールしましょう。`gem`で一発です。

```bash
# gem install ginjo-rfm
```

# コードを書いていく
そしてコードを書いていくわけですが、[README](https://github.com/ginjo/rfm/blob/master/README.md) がとても充実していますので、何かわからないことがあったらこちらを参照すればまず問題ないでしょう。以下、書くべきコードを順番に逐一説明していきます。実行する内容は CRUD のうち Read に絞ります。

## まずは`require`
なにはともあれ`require`しましょう。

```ruby:rfm_first_trial.rb
require 'rfm'
```

## 接続情報を書く
README には yml に書く方法が載っていますが、とにかくわかりやすさ重視で実行するコード内に直接書いていきましょう。`RFM_CONFIG`に以下のように定義します。


```ruby:rfm_first_trial.rb
RFM_CONFIG = {
  :host          => 'FileMaker Server のアドレス',
  :account_name  => 'ユーザ名',
  :password      => 'ユーザ名に対するパスワード',
  :database      => 'データベースの名前',
  :layout        => 'レイアウト名',
  :ssl           => false # デフォルトが true であるので false の場合は明示する
}
```

## メソッドを実行するためのクラスを作る
`Rfm::Base`を継承したクラスを作りましょう。`RfmTrial`というクラスを作ります。設定情報は前述に記載した内容で全て埋まっていますので、ただクラスを作成するだけでよいです。README ではこの定義中でレイアウトを指定したりしてますね。

```ruby:rfm_first_trial.rb
class RfmTrial < Rfm::Base
end
```

## メソッドを実行して結果を得る
README にもあるように、オリジナルの Rfm に実装されているメソッドをそのまま実行することができます。ただし、一部のメソッドの挙動は ginjo-rfm では少しだけ変更されています。詳しくは以下のドキュメントを参考にしてください。

- [オリジナルの Rfm のドキュメント](http://sixfriedrice.com/rdoc/rfm/)
- [ginjo-rfm のドキュメント](http://www.rubydoc.info/github/ginjo/rfm)

さて、ここでは`find`メソッドを用いて検索（Read）をしましょう。以下のように書くだけです。検索の記法は FileMaker のそれと同じ記法です。結果の表示もしてしまいます。

```ruby:rfm_first_trial.rb
records = RfmTrial.find(:対象フィールド => "==apple")
puts records
```

`records`は配列で返ってきますので、結果を個別に処理したい場合は`each`してやれば良いと思います。

## エラー処理
ginjo-rfm のエラー処理は PHP 系のライブラリとはやや異なります。これまた README にそのまま書いてありますので引用します。

> Finally, if filemaker returns an error when executing any of these methods, an error will be raised in your Ruby script. There is one exception to this, though. If a find results in no records being found (FileMaker error # 401) I just ignore it and return you a Resultset with zero records in it. If you prefer an error in this case, add :raise_on_401 => true to the options you pass the Rfm::Server when you create it.

# 具体例
それではここまでの手順を具体例にあてはめましょう。

## 利用するデータベース
まずは具体例に利用するデータベースが必要です。以下のように`Staff`というデータベースの`StaffData`レイアウト内の`staff_data`というテーブルを用います。

![fm_Qiita_02.png](https://qiita-image-store.s3.amazonaws.com/0/72181/fdefe835-1538-1f7e-41ff-08d165504f1f.png)

![fm_Qiita_03.png](https://qiita-image-store.s3.amazonaws.com/0/72181/2fb3cf37-c1d7-92e7-5344-31b579ed7df0.png)

以下の5つのカラムが定義されているのが分かります。

- `id`
- `name`
- `gender`
- `work`
- `point`

このテーブルに対して 7 つのデータが投入されています。

## コードを書く
これまでに書いた内容をまとめて、以下のような検索条件で検索をしてみましょう。

> `gender`が`female`であるレコード

以下がコードと実行結果になります。

```ruby:rfm_first_trial.rb
require 'rfm'

RFM_CONFIG = {
  :host          => 'FileMaker Server のアドレス',
  :account_name  => 'ユーザ名',
  :password      => 'ユーザ名に対するパスワード',
  :database      => 'Staff',
  :layout        => 'StaffData',
  :ssl           => false
}

class RfmTrial < Rfm::Base
end

records = RfmTrial.find(:gender => "==female")

puts "#{records.length} 件ヒットしました！\n\n"
puts "ヒットした方のお名前は以下のとおりです"
records.each do |record|
  puts record["name"]
end
```

```bash:結果
3 件ヒットしました！

ヒットした方のお名前は以下のとおりです
higashino
ishikawa
kawano
```

# 注意点
FileMaker 上で`""`で定義されている値の返り値は、`empty`ではなく`nil`になりますので注意です。

# まとめ
以上、ginjo-rfm のごくごく簡単な使い方です。README やドキュメントを見れば分かるように、便利なメソッドや記述を簡潔にする手法が数多く存在します。FileMaker API for PHP や FX.php と比べてコードの見通しが良くて記述量が少ないのが Ruby っぽいですね[^1]。

[^1]: まあ ginjo-rfm の実装によるところも大きいですが