Rails - Добавление пользовательских полей во время выполнения в ActiveRecord - PullRequest
7 голосов
/ 04 февраля 2010

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

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

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


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

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

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

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

Ответы [ 3 ]

6 голосов
/ 04 февраля 2010

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

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
1 голос
/ 04 февраля 2010

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

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

В документации для ActiveRecord :: Associates :: ClassMethods .

есть заголовок «Полиморфные ассоциации».
1 голос
/ 04 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...