У меня есть модель мультимедиа, которая имеет кучу стандартных атрибутов метаданных и сохраняется в базе данных как обычно. Теперь я хочу добавить к этой модели дополнительные атрибуты метаданных поверх существующих атрибутов. Список этих атрибутов будет определен в файле конфигурации и загружен во время выполнения. Они будут храниться в базе данных в другой таблице как ряд пар значений свойств с привязкой к основной модели.Преобразование атрибутов Rails в пары значений свойств
Итак, мой код в настоящее время,
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
и @media.contributor
несмотря на то, что они будут находиться в ассоциации @media.custom_metadata
, где его значение будет что-то вроде [{:name => 'publisher', :value => 'Fred'}, {:name => 'contributor', :value => 'Bill'}]
Кажется, что виртуальные атрибуты были бы лучшим способом достижения этого, но все примеры, которые я могу найти для людей, использующих виртуальные атрибуты, - это то, где имена атрибутов являются статическими и известными, а не динамическими из времени выполнения конфигурации, поэтому они могут определять такие методы, как publisher
и publisher=
, которые затем содержат код для записи в соответствующий связанный файл rty-value.
я могу определить атрибуты в классе с attr_accessor *Settings.custom_metadata_fields
(при условии, Settings.custom_metadata_fields
возвращается [:publisher, :contributor]
), а также позволяют массовое назначение, используя подобную технику с attr_accessible
.
Часть, на которую я застреваю, заключается в том, как заполнить виртуальные атрибуты из ассоциации при загрузке данных из записи, а затем, наоборот, как передать данные в виртуальных атрибутах обратно в ассоциацию до того, как запись сохранены.
два способов я в настоящее время вижу эту работу, либо с помощью method_missing
или attribute_missing
, или, возможно, через initialize
и before_save
обратный вызов? В любом случае, я не уверен, как бы я определил его, учитывая, что моя модель имеет сочетание обычных атрибутов и виртуальных атрибутов.
Любые предложения?
Спасибо за предложение. К сожалению, мы стандартизированы здесь в MySQL, так как наша база данных, поэтому переход на PostgreSQL на самом деле не вариант. Как вы могли бы написать обратные вызовы, учитывая смесь нормальных и виртуальных атрибутов? – richard
Предложение обратных вызовов было хорошим. Я опубликовал код о том, как я реализовал обратные вызовы в ответе ниже. – richard