我需要保存这个数组:
params[:products]
数组包含以下信息:
[{"'name'"=>"Product Name 1 ", "'id'"=>"2", "'quantity'"=>"2", "'accessory'"=>{"'id'"=>"8", "'name'"=>"Accessory Name 1"}}, {"'name'"=>"Product Name 2 ", "'id'"=>"5", "'quantity'"=>"1", "'accessory'"=>{"'id'"=>"40", "'name'"=>"Accessory Name 2"}}]
如您所见,accessory
是另一个数组。
过程是这样的:一个前端人员给我这个数组,所以我想在order.rb
模型上存储所有数据。
所以,我有几个问题:
我正在寻找一些例子,我一直在order
模型上尝试这个:
serialize :product
order = Order.new
order.product = [:product]
order.save
order.product
我对此方法也很感兴趣:http://api.rubyonrails.org/classes/ActiveRecord/Store.html
也许这是一个基本问题,但我真的不知道如何解决它。正如您所看到的,我在任何控制器中都没有代码,因为我真的不知道我需要写什么。
感谢您的帮助。
答案 0 :(得分:1)
查尔斯,
我建议你考虑使用你的postgres的hstore类型。使用它的好处很少(性能,对象索引等)。
enable_extension 'hstore'
这实际上使您的PSQL具有此支持。
您的迁移将是这样的:
class AddRecommendationsToPages < ActiveRecord::Migration
def change
add_column :pages, :recommendations, :hstore
end
end
之后,您可以将任何想要的内容传递给您的hstore。
irb(main):020:0> Page.last.recommendations
Page Load (0.8ms) SELECT "pages".* FROM "pages" ORDER BY "pages"."id" DESC LIMIT 1
=> {"products"=>"34,32"}
irb(main):021:0> Page
=> Page(id: integer, block: string, name: string, slug: string, title: string, h1: string, annotation: text, article: text, created_at: datetime, updated_at: datetime, position: integer, parent: integer, show: boolean, recommendations: hstore)
irb(main):022:0> Page.last.recommendations["products"]
Page Load (0.6ms) SELECT "pages".* FROM "pages" ORDER BY "pages"."id" DESC LIMIT 1
=> "34,32"
irb(main):023:0>
答案 1 :(得分:1)
除了hstore,另一个解决方案是JSON,特别是我建议你使用PostgreSQL类型&#34; jsonb&#34;因为效率更高,请参阅文档:
有两种JSON数据类型:json和jsonb。他们接受几乎相同的值集作为输入。主要的实际差异是效率。 json数据类型存储输入文本的精确副本,处理函数必须在每次执行时重新分析;而jsonb数据以分解的二进制格式存储,由于增加了转换开销,因此输入速度稍慢,但处理速度要快得多,因为不需要重新分析。 jsonb还支持索引,这可能是一个重要的优势。
(更多信息请https://www.postgresql.org/docs/current/static/datatype-json.html)
因此,与hstore类似,您可以执行可以执行查询的数据结构,并且此查询非常快,如上所述。这是一个优于其他策略的重要优势,例如序列化Ruby哈希并将其直接保存在数据库中。