Rails: проектирование модели с неизвестными атрибутами

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

Адреса будут созданы путем импорта строк из .csv файл. CSV должен иметь address столбец, но может иметь много других, и они могут быть чем-то еще и поэтому невозможно предсказать.

Как я могу точно хранить эту информацию без необходимости каждый раз добавлять новые столбцы БД? Могу ли я сделать что-то вроде extra Столбец БД, в котором хранится информация из столбцов не в модели? Могу ли я выполнить запросы в этом поле (хотя и убито)? Наконец, при экспорте этой информации обратно в CSV я могу экспортировать extra информация обратно?

2 ответа

Решение

Одним из способов решения этой проблемы является использование Postgres в качестве базы данных и создание таблицы с 2 столбцами: address а также data где данные имеют jsonb тип. То, что это дает вам, - это способность выдвигать произвольные данные ключ / значение. Вы все еще можете запросить его через SQL и иметь индексы для этих полей.

Альтернативой может быть использование базы данных NoSQL, такой как Mongo или Couch.

Вы можете хранить свои данные как JSON в любой text введите столбец.. и получить его как

<% @applicant_user_workflow_step.properties.each do |key, value| %>
      <tr>
        <td><strong><%= key %> </strong></td>
      </tr>
      <tr>
        <td><%= value %></td>
      </tr>
 <% end %>

или же

<%= fields_for :properties, OpenStruct.new(@applicant_user_workflow_step.properties) do |builder| %>
      <% @workflow_step.fields.order(:order_value).each do |field| %>
        <div class="row">
          <% if field.field_type.eql?('rating') %>
            <%= render "applicants/fields/application_custom_rating/rating", field: field, f: builder %>
          <% else %>
            <%= render "applicants/fields/#{field.field_type}", field: field, f: builder %>
          <% end %>
        </div>
      <% end %>
    <% end %>

Openstruct позволяет вам получить доступ key как instance методы для hash

или просто следуйте этому
блог: http://railscasts.com/episodes/403-dynamic-forms?view=asciicast
ответ: Использование Rails сериализации для сохранения хеша в базе данных

Другие вопросы по тегам