Направляющие - Добавление Пользовательских Полей во времени выполнения в ActiveRecord

Вы знаете, как некоторые средства отслеживания ошибки (и другое программное обеспечение) позволяют Вам добавлять пользовательские поля?

Обычно это сделано со структурой данных, которая выглядит примерно так:

  Items
----------
 ID | NAME | ITEM_TYPE_ID


 FieldDefinitions
---------------------------------------
 ID | ITEM_TYPE_ID | FIELD_NAME | FIELD_TYPE

 FieldValues
---------------------------------------
ID | FIELD_ID | ITEM_ID | VALUE

Я пытаюсь выяснить лучший способ приблизиться к этому дизайну в направляющих. Будет много моделей, которые я хочу позволить расширять простые свойства.

Когда я получаю Item Я хотел бы, чтобы это включало хеш дополнительных значений полей, которые были определены для той модели.

7
задан mat 4 February 2010 в 21:52
поделиться

3 ответа

Что-то вроде...?

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
6
ответ дан 7 December 2019 в 05:22
поделиться

Взгляните на Friendly ORM . Это позволяет вам работать с mysql без схемы. Он был вдохновлен этим сообщением в блоге о том, как Friendfeed использует mysql для хранения данных без схемы.

Friendly заменит ActiveRecord, хотя вы можете довольно легко использовать модели ActiveRecord рядом с Friendly-моделями.

1
ответ дан 7 December 2019 в 05:22
поделиться

Если вы хотите, чтобы ваши записи FieldDefinition принадлежали различным моделям (например, , столбец item_id , который указывает либо на SqueekyToyItem , либо на BalloonItem ), тогда вам нужна полиморфная ассоциация.

Это в основном позволяет вам иметь столбец item_type (рядом с вашим столбцом item_id ), в котором затем указывается фактический тип элемента, на который он указывает.

В документации для ActiveRecord :: Associations :: ClassMethods есть заголовок «Полиморфные ассоциации».

1
ответ дан 7 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: