【问题标题】:Rails: designing a model with unknown attributesRails:设计具有未知属性的模型
【发布时间】:2015-11-28 17:00:18
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    替代方案是使用 NoSQL 数据库,如 Mongo 或 Couch。

    【讨论】:

    • 刚刚在 Rails 4 中发现了 Store。看起来正是我想要的?
    【解决方案2】:

    您可以将您的数据作为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 允许您以 instance 方法访问 key hash

    或者简单地按照这个
    博客:http://railscasts.com/episodes/403-dynamic-forms?view=asciicast
    答案:Using Rails serialize to save hash to database

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多