You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中jsonb字段supported_currencies的数据存储方法问询

Rails表创建与jsonb字段数据存储实操

一、创建带jsonb字段的表

先写迁移文件,比如你要创建products表(换成自己的业务表名即可),迁移代码如下:

class CreateProducts < ActiveRecord::Migration[7.0]
  def change
    create_table :products do |t|
      # 按需添加其他业务字段,比如商品名称
      t.string :name
      # 你定义的jsonb字段,默认空数组,不允许为null
      t.jsonb "supported_currencies", default: [], null: false

      t.timestamps
    end
    # 可选:如果后续要基于这个jsonb字段做查询,加个GIN索引能提升查询效率
    add_index :products, :supported_currencies, using: :gin
  end
end

写完后执行迁移命令:rails db:migrate,表就创建完成了。

二、把表单数据存进jsonb字段

1. 处理表单提交参数

假设前端表单提交的参数结构是这样的(多选货币后携带对应汇率):

# 示例提交参数
params = {
  product: {
    name: "跨境商品",
    supported_currencies: [
      { currency: "USD", rate: 1.3 },
      { currency: "ZAR", rate: 1.03 }
    ]
  }
}

2. 模型中配置强参数

在对应的模型文件(比如app/models/product.rb)里,配置强参数允许传入嵌套结构:

class Product < ApplicationRecord
  def self.permitted_params(params)
    params.require(:product).permit(
      :name,
      # 允许supported_currencies作为包含currency和rate的数组哈希传入
      supported_currencies: [:currency, :rate]
    )
  end
end

3. 控制器中保存数据

在控制器里直接用强参数创建或更新记录:

# 创建新记录
Product.create(Product.permitted_params(params))

# 更新已有记录
product = Product.find(params[:id])
product.update(Product.permitted_params(params))

4. 手动构造数据存储(非表单场景)

如果是自己构造数据而非来自表单,直接赋值数组哈希即可:

product = Product.new(name: "手动测试商品")
product.supported_currencies = [
  { currency: "USD", rate: 1.3 },
  { currency: "ZAD", rate: 1.93 }
]
product.save!

三、验证数据存储是否正确

打开Rails控制台,查询最新记录就能验证:

product = Product.last
puts product.supported_currencies.inspect
# 输出示例:[{ "currency" => "USD", "rate" => 1.3 }, { "currency" => "ZAR", "rate" => 1.03 }]

内容的提问来源于stack exchange,提问作者awais iqbal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:10:34