LoginSignup
5
6

More than 5 years have passed since last update.

Rubyアプリで静的なデータを管理する

Posted at

値が変更されないような静的なデータは、MySQLやMongoDBなどのDBに格納するより、起動時にメモリにロードするとパフォーマンスが向上し、管理も簡単になります。

ここで紹介する方法はRailsプロジェクトのみに限らず、Sinatraプロジェクトやその他のRubyプロジェクトでも使用できます。

settingslogicのインストール

settingslogicはYAMLファイルから設定をロードするgemです。Railsアプリだと Rails.env の値(developmentproductiontest など)に応じた設定も簡単にロードすることができます。

プロジェクトで使用するには、Gemfile に追加します。

Gemfile
gem 'settingslogic' 

データの準備

データをYAMLで用意します。例として部屋番号とIPアドレスのペアをデータとして格納します。このYAMLファイルでは、全ての環境で defaults の値を継承します。

config/room_and_ip.yml
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 にファイルをロードするスクリプトを追加します。

config/initializers/room_and_ip.rb
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のクラス(この例だと RoomIP モデルなど)のメソッドに追加すると、より自然にデータを関連付けることができます。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6