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 データを使用してデータベースをシードすることをお勧めします。