我有一个Ruby on Rails表单,可以将输入保存为模型属性。但其中一个属性是json数据类型。我想把多个字段输入的数据合并成一个JSON对象存储在我的模型属性中。是否有方法可以做到这一点?
如果有帮助的话,我也可以创建一个Hash,然后将其转换为json格式。基本上,我只是想将多个输入字段合并成一个字段,然后从那里处理。
谢谢!
我有一个Ruby on Rails表单,可以将输入保存为模型属性。但其中一个属性是json数据类型。我想把多个字段输入的数据合并成一个JSON对象存储在我的模型属性中。是否有方法可以做到这一点?
如果有帮助的话,我也可以创建一个Hash,然后将其转换为json格式。基本上,我只是想将多个输入字段合并成一个字段,然后从那里处理。
谢谢!
在这里需要考虑多个问题。
第一个问题是将数据从HTML表单中提取出来。如果您使用标准的Rails命名表单输入的方式,那么这将非常简单。
<input name="my_fields[value1]">
<input name="my_fields[value2]">
<input name="my_fields[sub1][value1]">
<input name="my_fields[sub1][value2]">
如果您像这样命名它们,可以使用params[:my_fields]
通过params
哈希以“en bloc”的方式访问它们,这将为您提供另一个包含数据的哈希表。string
或text
列并分配一个JSON字符串即可:@my_model.my_data = params[:my_fields].to_json
2. 使用序列化哈希表
在模型上使用string
或text
列,并将其声明为可序列化。
serialize :my_data, Hash
然后,您可以像使用简单哈希表一样使用此列,Rails将执行读取和写入操作。
@my_model.my_data = params[:my_fields]
to_json
。3. 使用专门的JSON数据库类型
如果您需要能够使用SQL查询数据库,则上述解决方案将无法奏效。您必须使用专门的数据类型。
许多数据库管理系统提供了以 XML 或甚至 JSON 类型形式的结构化数据类型。(例如PostgreSQL)
更新:自Rails 5以来,支持JSON列类型。如果您正在使用PostgreSQL或MySQL,请在迁移中使用t.json
(或t.jsonb
),并像常规哈希一样使用该属性。
a = JSON.parse('{"k1":"val1"}')
a['k1'] => "val1"
你可能应该研究一下Postgres的新JSONB格式。我认为这可以让你获得所有的优点,而没有任何缺点:
before_save
,它将获取您的所有模型属性,并使用 .to_json
方法创建 JSON 格式。