2013-07-13 2 views
0

Я запускаю проект через несколько недель, который является webapp, который обрабатывает веб-сайты на нескольких языках для дочерних компаний той же компании. Хотя внешний интерфейс может выглядеть по-другому, все они подписываются на тот же дизайн модели под ним.Rails: Есть ли камень для обработки динамических полей?

Но одним из основных требований является то, что каждое дочернее предприятие может выбрать, какие поля модели будут отображаться на их веб-сайте.

Например: Там Program моделирует

class Program < AR 
    attr_accessible :starting_at, :ending_at, :name, :price, :country 
end 

Так что, если у меня есть две дочерних компании, то есть США и Швеция, они оба используют ту же самую модель для представления программ. Но филиал в США хочет показать таблицу со всеми программами, и для каждой программы показываются только starting_at, ending_at, name и price. Шведский филиал хочет сделать то же самое, но не хочет показывать ending_at, но country.

Кроме того, они хотят иметь возможность выбирать, какие поля будут отображаться через веб-интерфейс, поскольку он может меняться со временем.

Итак, моя мысль была - так как происходит много метамоделирования, - чтобы придумать модель MetaProgram, или так, где хранится информация, какое поле, для которого должно отображаться дочернее устройство, и т. Д. Но это приведет к динамические операторы SQL с ActiveRecord, так как мне всегда нужно выбирать, какие поля должны быть выбраны, чтобы затем выбрать фактические данные, чтобы представить их через интерфейс ...

Есть ли лучшее решение для этого или камень, который ступает по этому поводу?

PS: Извините за двусмысленным названием

+0

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

+0

Но может быть, вы можете получить тот же результат проще, просто не показывая поля, которые ноль/пустые? –

+0

Невозможно сделать последнее, потому что поля не будут пустыми. Просто не хочется, чтобы они показывались на итоговом уровне, но на подробной информационной этикетке. И да, это своего рода супер cms :-) – Vapire

ответ

3

Я не знаю, если это именно то, что вы ищете.

Я использую ActiveRecord::Store для этого. Это похоже на хранилище ключей/значений для вашей модели.

У вас есть таблица вроде этого:

create_table do |t| 
    t.text :metadata # just a text column, will store serialized hash 
end 

И модель, как это:

class Program < ActiveRecord::Base  
    store :metadata, :accessors => [:starting_at, :ending_at] 

    # validate like normal fields 
    validates :starting_at, :presence => true 
end 

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

Возможно, недостатком является то, что сохраненные метаданные нельзя индексировать, и вы не можете использовать их в запросах.

Я нашел хороший небольшой учебник и объяснение по этой теме here.

+0

Спасибо!Я это проверю! Я еще не уверен, нужны ли мне такие столбцы в запросах. Но мне интересно, можно ли объединить эту функциональность с возможностями HStore Postgres ... – Vapire

+0

Я думаю, что этот драгоценный камень именно то, что вы ищете: https://github.com/diogob/activerecord-postgres-hstore – nico

Смежные вопросы