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 сериализации для сохранения хеша в базе данных