Вы знаете, как некоторые средства отслеживания ошибки (и другое программное обеспечение) позволяют Вам добавлять пользовательские поля?
Обычно это сделано со структурой данных, которая выглядит примерно так:
Items
----------
ID | NAME | ITEM_TYPE_ID
FieldDefinitions
---------------------------------------
ID | ITEM_TYPE_ID | FIELD_NAME | FIELD_TYPE
FieldValues
---------------------------------------
ID | FIELD_ID | ITEM_ID | VALUE
Я пытаюсь выяснить лучший способ приблизиться к этому дизайну в направляющих. Будет много моделей, которые я хочу позволить расширять простые свойства.
Когда я получаю Item
Я хотел бы, чтобы это включало хеш дополнительных значений полей, которые были определены для той модели.
Что-то вроде...?
class Item < ActiveRecord::Base
has_many :field_values
has_many :field_definitions, :through => :field_values
def custom_fields_hash
cfh = {}
self.field_values.each |fv|
cfh[fv.field_definition] = fv
end
cfh
end
end
class FieldValue < ActiveRecord::Base
belongs_to :item
belongs_to :field_definition
end
class FieldDefinition < ActiveRecord::Base
has_many :field_values
has_many :items, :through => field_values
end
Или ты можешь поменять
cfh[fv.field_definition] = fv
... на...
cfh[fv.field_definition.field_name] = fv.value
Взгляните на Friendly ORM . Это позволяет вам работать с mysql без схемы. Он был вдохновлен этим сообщением в блоге о том, как Friendfeed использует mysql для хранения данных без схемы.
Friendly заменит ActiveRecord, хотя вы можете довольно легко использовать модели ActiveRecord рядом с Friendly-моделями.
Если вы хотите, чтобы ваши записи FieldDefinition
принадлежали различным моделям (например, , столбец item_id
, который указывает либо на SqueekyToyItem
, либо на BalloonItem
), тогда вам нужна полиморфная ассоциация.
Это в основном позволяет вам иметь столбец item_type
(рядом с вашим столбцом item_id
), в котором затем указывается фактический тип элемента, на который он указывает.
В документации для ActiveRecord :: Associations :: ClassMethods есть заголовок «Полиморфные ассоциации».