Rails: 设计一个属性未知的模型

Rails: designing a model with unknown attributes

在我的应用程序中,我有一个名为 Address 的模型。其中的address字段是唯一必填字段,但模型可以有任意数量的不同的其他属性。

地址将通过从 .csv 文件中导入行来创建。 CSV 有一个 address 列,但可能有许多其他列,它们可以是任何其他内容,因此无法预测。

我怎样才能准确地存储这些信息而不必每次都添加新的数据库列?我可以制作类似 extra 数据库列的东西来存储来自不在模型中的列的信息吗?我可以 运行 查询该字段(尽管是混蛋)吗?最后,当 将此信息导出 回 CSV 时,我可以将 extra 信息导出回来吗?

解决这个问题的一种方法是使用 Postgres 作为数据库,并有一个包含 2 列的 table:addressdata,其中数据是 jsonb 类型.它给你的是推送任意 key/value 数据的能力。您仍然可以通过 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
答案:Using Rails serialize to save hash to database