9

我有一个 Ruby on Rails 表单,它接受输入并将其保存为模型属性。但是,其中一个属性包含 json 数据。我希望能够将输入到多个字段中的数据保存为我的模型属性中的单个 JSON 对象。有没有办法我可以做到这一点?

如果有帮助,我还可以制作一个哈希并将其转换为 json。基本上我只想将多个输入字段合并为一个,然后从那里传递出去。

谢谢!

4

4 回答 4

17

这里有很多事情需要考虑。

第一个问题是从 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如果您这样命名它们,则可以使用哈希通过“整体”访问它们params[:my_fields],这将为您提供另一个包含您的数据的哈希。

然后你必须选择在你的模型中保存这些数据的方式。有几种选择:

1.使用字符串属性

只需使用stringortext列并分配一个 JSON 字符串:

@my_model.my_data = params[:my_fields].to_json
  • Pro:一个非常简单的解决方案。
  • 相反:SQL 查询几乎是不可能的。使用 Rails 进行处理需要手动解析数据字符串。

2.使用序列化哈希

使用stringortext列并在模型上将其声明为可序列化

serialize :my_data, Hash

然后你可以使用这个列,因为它是一个简单的哈希,Rails 将执行读取和写入操作。

@my_model.my_data = params[:my_fields]
  • Pro:仍然是一个简单的解决方案。没有搞乱 JSON 字符串。使用 Rails 处理更容易。
  • 相反:SQL 查询几乎是不可能的。to_json如果您需要真正的 JSON 字符串,则需要调用。

3.使用专门的 JSON 数据库类型

如果您需要能够使用 SQL 查询数据库,上述解决方案将不起作用。您必须为此使用专门的类型。

许多 DBMS 以 XML 甚至 JSON 类型的形式提供结构化数据类型。(例如 PostgreSQL)

  • 优点:可以进行数据库查询。
  • 相反:需要自定义解析和序列化,迁移同上。这个解决方案可能是过度设计的。
于 2012-12-27T11:05:11.233 回答
2

您可以将所有多个文件保存为 JSON 格式的文本,并在需要时解析该字段。

前任:

a = JSON.parse('{"k1":"val1"}')
a['k1'] => "val1"
于 2012-12-26T23:42:55.403 回答
0

您可能会寻找一个before_save包含所有模型属性并使用方法创建 JSON 格式的.to_json方法。

于 2012-12-27T10:34:24.477 回答
0

您可能应该研究一下 Postgres 的新 JSONB 格式。我认为这可以让您获得所有优点,而没有任何缺点:

http://robertbeene.com/rails-4-2-and-postgresql-9-4/

于 2015-02-07T15:36:33.440 回答