Ruby on rails 使用Rails和Postgresql在jsonb字段中存储数组数据

Ruby on rails 使用Rails和Postgresql在jsonb字段中存储数组数据,ruby-on-rails,ruby,postgresql,jsonb,Ruby On Rails,Ruby,Postgresql,Jsonb,假设我有一个汽车模型,我想在其中显示不同类型的数据。我将数据列添加到表中: class AddDataToCars < ActiveRecord::Migration[5.0] def change add_column :cars, :data, :jsonb, null: false, default: '{}' add_index :cars, :data, using: :gin end end 我确保它是cars\u controller.rb中允许的

假设我有一个汽车模型,我想在其中显示不同类型的数据。我将
数据
列添加到表中:

class AddDataToCars < ActiveRecord::Migration[5.0]
  def change
    add_column :cars, :data, :jsonb, null: false, default: '{}'
    add_index  :cars, :data, using: :gin
  end
end
我确保它是
cars\u controller.rb中允许的参数:

def car_params
  params.require(:car).permit(:make, :model, :data, :wheel_count, :extra_options)
end
现在,我可以在我的
\u form.html.erb
partial中创建一个文本输入,将数据放入
wheel\u count
中,如下所示:

<div class="field">
  <%= f.label :wheel_count %>
  <%= f.text_field :wheel_count %>
</div>
产生了以下标记:

<input name="car[extra_options][]" type="hidden" value="" />     
<select multiple="multiple" name="car[extra_options][]" id="car_extra_options">
  <option value=""></option>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
</select>
这将导致消息
Unpermitted参数:extra_options
,因此似乎不允许我在此字段中放置数组

仅仅为一些额外的选项创建一个jsonb字段似乎很愚蠢,但它自然也会保存所有其他类型的数据


那么,我如何才能创建一个多选列表,或者最好是一组复选框,将数据正确保存在jsonb字段中(当然,当编辑提交时,会显示已选择/选中的项目)?

试试这个,在car_参数中

params.require(:car).permit(:make, :model, :data, :wheel_count, extra_options: [])
对于复选框,请尝试此选项

    <%= hidden_field_tag "car[extra_options][]", [] %>
    <% ["1", "2", "3", "4", "5"].each do |o| %>
      <% default_checked = car.extra_options.include?(o.to_s) rescue false %>
      <label class="rightpad">
        <%= check_box_tag "car[extra_options][]", o, default_checked %>
      </label>
      <span>
        <%= o %>
      </span>
    <% end %>


这完全有效。您知道如何使其成为复选框而不是选择列表吗。我似乎无法找到像上面那样的一条直线(如果可能的话)。你知道我为什么不能这样创建一个新对象吗:
c=Car.new
c.extra\u options=[1,3]
难道我不能这样做吗?
"extra_options"=>["", "2", "3"]
params.require(:car).permit(:make, :model, :data, :wheel_count, extra_options: [])
    <%= hidden_field_tag "car[extra_options][]", [] %>
    <% ["1", "2", "3", "4", "5"].each do |o| %>
      <% default_checked = car.extra_options.include?(o.to_s) rescue false %>
      <label class="rightpad">
        <%= check_box_tag "car[extra_options][]", o, default_checked %>
      </label>
      <span>
        <%= o %>
      </span>
    <% end %>