【问题标题】:JSON datatype in forms with Rails 4Rails 4 表单中的 JSON 数据类型
【发布时间】:2016-02-27 00:00:27
【问题描述】:

我有一个 JSON 数据类型的 Postgresql 数据库表。这是该表的 Rails 迁移:

class CreateResults < ActiveRecord::Migration
  def change
    create_table :results do |t|
      t.references :athlete, index: true, foreign_key: true
      t.references :competition, index: true, foreign_key: true
      t.string :age_group, limit: 100
      t.text :tags, array: true, default: []
      t.json :results
      t.timestamps null: false
    end
  end
end

此表包含运动员的比赛结果,由于不同的运动员可以参加不同的比赛,因此我将结果字段创建为 JSON 数据类型。

结果字段的示例条目是:

{
  "event1": {
      "time":"10:00",
      "place":"2"
  },
  "event2": {
      "time":"1:25:00",
      "place":"1"
  }...
}

有有限数量的事件:一组针对男孩运动员的事件,一组针对女孩运动员的事件,所以我试图将此字段连接到 Rails 表单,其中一个部分用于“男孩" 结果和“女孩”结果的其他部分。

无论如何,我似乎无法弄清楚让 Rails 了解 FormHelper 中使用的输入或输出的机制。我试图用尽可能少的 Javascript 来做到这一点。

这是我在控制器中的强参数:

def result_params
  params[:result].permit(:age_group, :athlete_id, :competition_id, :results => {}, :tags => [])
end

我曾尝试这样连接表单,但无济于事。

<%= f.fields_for :results do |res| %>
  <table class="table table-responsive table-striped">
    <thead>
      <tr>
        <th>Event</th>
        <th>Time</th>
        <th>Place</th>
      </tr>
    </thead>
    <tbody>
    <%= res.fields_for :event1 do |e1| %>
    <tr>
      <td>Event 1</td>
      <td><%= e1.text_field :time %></td>
      <td><%= e1.text_field :place %></td>
    </tr>
    <% end %>
    <%= res.fields_for :event2 do |e2| %>
    <tr>
      <td>Event 2</td>
      <td><%= e2.text_field :time %></td>
      <td><%= e2.text_field :place %></td>
    </tr>
    <% end %>
    ...

它不会自动从@res.results 中“获取”数据,我必须手动指定每个字段的值。当我这样做时,这会使我的表格无法用于新结果。此外,当我填写表格并按提交时,它正确提交,但我的结果字段的值被转换为 nil,我丢失了所有数据。我什至尝试测试一些东西,然后创建了一个文本区域,我刚刚输入了一个 JSON 对象字符串,Rails 将其吐出。几个小时以来,它已经进行了相当多的试验并且总是出错......我正在尝试做的事情甚至可能仅使用 Rails 吗?

【问题讨论】:

  • 对于男孩结果和女孩结果...而不是有两种形式,为什么不直接在结果表上设置 :gender 属性?然后,当您想要 @girl_results = Result.where(gender: 'female') 或类似的结果时,您可以遍历所有女孩结果。

标签: ruby-on-rails json postgresql ruby-on-rails-4


【解决方案1】:

(1) 不喜欢在结果表results上命名字段。

(2) 我会为您尝试做的事情重构数据模型。把事情简单化。在这种情况下,您似乎实际上不需要存储 Json。该表称为结果...为什么每个结果/事件都没有表条目?一个运动员有很多结果,一个结果属于一个用户。每个结果都将是一个单独的条目,而不是试图将所有结果推入散列。我敢肯定你想这样做是有原因的,但我想不出有什么好处。拥有 has_many 可以让您说出 @athlete.results 并遍历它们,这似乎是您想要做的。

【讨论】:

  • 我最初创建了一个 EventResult 模型并链接到 Result 模型,但不管你信不信,这似乎有点矫枉过正。我认为 JSON 对象更好地代表了这个问题,因为所有事件结果每次都一起添加/更新。所以你有一个比赛,你更新那个比赛的“结果”,事件结果只是结果的一个属性。我查询该字段没有问题,这只是我遇到问题的存储和表单预填充。我认为如果每次更新结果时都必须更新 6-8 个事件结果,我会遇到同样多的问题。
  • 越想越觉得这是正确的答案。我喜欢 JSON 对象的灵活性,但这种方式效果很好,满足我的需要。
猜你喜欢
  • 2014-04-10
  • 2023-04-02
  • 2018-04-11
  • 2014-05-05
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多