値が変更されないような静的なデータは、MySQLやMongoDBなどのDBに格納するより、起動時にメモリにロードするとパフォーマンスが向上し、管理も簡単になります。
ここで紹介する方法はRailsプロジェクトのみに限らず、Sinatraプロジェクトやその他のRubyプロジェクトでも使用できます。
settingslogicのインストール
settingslogicはYAMLファイルから設定をロードするgemです。Railsアプリだと Rails.env
の値(development
、production
、test
など)に応じた設定も簡単にロードすることができます。
プロジェクトで使用するには、Gemfile
に追加します。
gem 'settingslogic'
データの準備
データをYAMLで用意します。例として部屋番号とIPアドレスのペアをデータとして格納します。このYAMLファイルでは、全ての環境で defaults
の値を継承します。
defaults: &defaults
ip_addresses:
room101: 10.0.0.1
room102: 10.0.0.2
room201: 10.0.0.3
room202: 10.0.0.4
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
データを読み込む
先ほどのYAMLファイルをプロジェクト起動時に読み込むように設定します。Railsアプリの場合は initializers
にファイルをロードするスクリプトを追加します。
class RoomAndIp < Settingslogic
source Rails.root.join('config', 'room_and_ip.yml');
namespace Rails.env
end
Settingslogic
を継承して、ロードする設定を記述します。source
メソッドでロードするパスを指定します。また namespace
メソッドで、ロードする名前空間を指定できます。
Railsアプリからデータを参照するのは、クラスメソッドを呼び出します。
RoomAndIp.ip_addresses["room101"] # => "10.0.0.1"
Settingslogicは参照するキーが文字列なので、もっともらしいデータアクセスをするには、新たにメソッドを定義すると良いでしょう。
def ip_by_room(number)
RoomAndIp.ip_addresses["room#{number}"]
end
ip_by_room(101) # => "10.0.0.1"
ip_by_room(999) # => nil
関連するActionModelのクラス(この例だと Room
や IP
モデルなど)のメソッドに追加すると、より自然にデータを関連付けることができます。