一連の標準メタデータ属性を持ち、通常どおりデータベースに永続化されるメディア モデルがあります。ここでやりたいことは、構成可能なメタデータ属性をこのモデルに既存の属性の上に追加することです。これらの属性のリストは構成ファイルで定義され、実行時にロードされます。これらは、メイン モデルに関連付けられた一連のプロパティと値のペアとして、データベースの別のテーブルに格納されます。
だから、私のコードは現在、
class Media < ActiveRecord::Base
has_many :custom_metadata
attr_accessible :title, :language, :copyright, :description
end
と
class CustomMetadata < ActiveRecord::Base
belongs_to :media
attr_accessible :name, :value
end
私がやりたいことは、標準のメタデータ属性と同じ方法で Media モデルのカスタム メタデータ属性にアクセスして更新できるようにすることです。たとえば、カスタム メタデータ属性がpublisherおよびcontributorと呼ばれる場合、Media モデルでそれらにアクセスしたいと考えて@media.publisher
い@media.contributor
ます@media.custom_metadata
。[{:name => 'publisher', :value => 'Fred'}, {:name => 'contributor', :value => 'Bill'}]
仮想属性がこれを達成するための最良の方法であるように思われますが、仮想属性を使用している人々について私が見つけることができるすべての例は、属性の名前が実行時の構成から動的ではなく静的で既知のものであるため、関連するプロパティ値レコードに書き込むコードを含むpublisher
やなどのメソッドを定義できます。publisher=
( returnとattr_accessor *Settings.custom_metadata_fields
仮定して) を使用してクラスの属性を定義し、同様の手法を使用して.Settings.custom_metadata_fields
[:publisher, :contributor]
attr_accessible
私が立ち往生している部分は、レコードからデータをロードするときにアソシエーションから仮想属性を設定する方法と、逆に、レコードが保存される前に仮想属性のデータをアソシエーションに戻す方法です。
現在、これが機能していると思われる 2 つの方法は、 または を使用するか、またはコールバックを使用することmethod_missing
ですattribute_missing
か? どちらの場合も、モデルに通常の属性と仮想属性が混在しているため、どのように定義すればよいかわかりません。initialize
before_save
助言がありますか?