Techioz Blog

Railsで静的マスターデータをモデルとして扱う方法

概要

config/master_data/something.yml にあるようなデータベース以外のマスター データを Rails モデル (Active Record など) として扱うことは可能ですか? 指定された ID に一致する項目をレコードであるかのように取得したり、すべてのレコードの名前のリストを取得したりするなどの機能が欲しいと考えています。コントローラーやビューなど、さまざまな場所からこのデータにアクセスすると予想されます。 yml データのサンプルは次のとおりです。

items:
  - id: 1
    name: "Item1"
    description: "Description for Item1"
  - id: 2
    name: "Item2"
    description: "Description for Item2"

解決策

Rails では、ActiveModel は ActiveRecord から分離されているため、これをミックスインとして使用して、任意のデータ ソース (またはデータ ソースがまったくない) でモデルを作成するのは簡単です。

class Item
  include ActiveModel::Model
  include ActiveModel::Attributes
  attribute :id,          :integer
  attribute :name,        :string
  attribute :description, :string
end

これにより、フレームワークの残りの部分と対話するときに、ActiveRecord モデルと非常によく似た動作をするモデルが得られます。

次に、YAML データをロードし、リポジトリ パターンに保存するモデル インスタンスを作成できます。

class ItemRepository
  def initialize(file:)
    raw = YAML.load_file(file)
    @data = raw["items"].map do |hash|
      Item.new(hash)
    end
  end

  def find(id)
    @data.detect { |model| model.id == id }
  end
end

データがデータベースに存在しないことには大きな欠点があります。

ファイルをデータ ストレージとして使用することで得られる利点がどのようなものであると考えても、私の個人的な意見では、その価値はまったくありません。 YAML データを使用してデータベースをシードすることをお勧めします。