【发布时间】: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