Rails:设计具有未知属性的模型

时间:2015-09-03 01:56:29

标签: ruby-on-rails csv ruby-on-rails-4 smartercsv

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

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

如何准确存储此信息,而无需每次都添加新的数据库列?我可以创建类似extra数据库列的内容来存储不在模型中的列的信息吗?我可以在该字段上运行查询(虽然是个混蛋)吗?最后,当导出将此信息重新导入CSV时,我可以将extra信息导出回来吗?

2 个答案:

答案 0 :(得分:4)

解决此问题的一种方法是将Postgres用作数据库,并使用包含2列的表格:addressdata,其中数据为jsonb类型。这给你的是能够推送任意键/值数据。您仍然可以通过SQL查询它并在这些字段上有索引。

替代方案是使用像Mongo或Couch这样的NoSQL数据库。

答案 1 :(得分:0)

您可以将数据SELECT s.e , v.T , v.G , CASE WHEN ( s.a = 'M' AND s.b = 'N' AND s.c = 'O' AND s.d = 'P' AND s.e = 'Q' ) THEN '0' WHEN ( s.a = 'M' AND s.b = 'N' AND s.c = 'O' AND s.d = 'P' ) THEN '1' ELSE '2' END AS type FROM table_v AS v LEFT OUTER JOIN table_s AS s ON ( v.a = s.a AND v.b = s.b AND v.c = s.c ) WHERE ( s.a = 'M' AND s.b = 'N' AND s.c = 'O' AND s.d = 'P' AND s.e = 'Q' ) OR ( s.a = 'M' AND s.b = 'N' AND s.c = 'O' AND s.d = 'P' ) OR ( s.a = 'M' AND s.b = 'N' ) 存储在任何JSON类型列中,并将其检索为

text

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

Openstruct可让您以[{1}}

<%= 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 %> 方式访问key

或简单地遵循这一点 博客:http://railscasts.com/episodes/403-dynamic-forms?view=asciicast
回答:Using Rails serialize to save hash to database