【发布时间】:2013-12-01 22:25:43
【问题描述】:
当用户提交带有一堆复选框的表单时,我正在尝试使用 Rails 4 和 Hstore (Postgres 9.2) 存储数组哈希。我遇到的问题是,一旦它们被存储,所有的值都会被引号转义,并且在检索时不可读
irb(main):070:0> Plan
=> Plan(id: integer, email: string, created_at: datetime, updated_at: datetime, first_name: string, professional: boolean, preferences: hstore)
irb(main):070:0> params = {"plan"=>{"first_name"=>"nick", "email"=>"test@test.com", "professional"= z", "gak"], "too"=>["tar", "taz", "tak"], :preferences=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"]}}}
=> {"plan"=>{"first_name"=>"nick", "email"=>"test@test.com", "professional"=>"true"}, "preferences"=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"], :preferences=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"]}}}
irb(main):071:0> plan = Plan.new(params['plan']) => #<Plan id: nil, email: "test@test.com", created_at: nil, updated_at: nil, first_name: "nick", professional: true, preferences: nil>
irb(main):072:0> plan.preferences = params['preferences']
=> {"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"], :preferences=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"]}}
irb(main):073:0> plan
=> #<Plan id: nil, email: "test@test.com", created_at: nil, updated_at: nil, first_name: "nick", professional: true, preferences: {"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"], :preferences=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"]}}>
irb(main):074:0> plan.save
(0.2ms) BEGIN
SQL (1.2ms) INSERT INTO "plans" ("created_at", "email", "first_name", "preferences", "professional", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["created_at", Mon, 18 Nov 2013 15:44:46 UTC +00:00], ["email", "test@test.com"], ["first_name", "nick"], ["preferences", {"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"], :preferences=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"]}}], ["professional", true], ["updated_at", Mon, 18 Nov 2013 15:44:46 UTC +00:00]]
(2.4ms) COMMIT
=> true
irb(main):075:0> plan
=> #<Plan id: 27, email: "test@test.com", created_at: "2013-11-18 15:44:46", updated_at: "2013-11-18 15:44:46", first_name: "nick", professional: true, preferences: {"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"], :preferences=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"]}}>
irb(main):076:0> plan_out = Plan.find(27)
Plan Load (0.7ms) SELECT "plans".* FROM "plans" WHERE "plans"."id" = $1 LIMIT 1 [["id", 27]]
=> #<Plan id: 27, email: "test@test.com", created_at: "2013-11-18 15:44:46", updated_at: "2013-11-18 15:44:46", first_name: "nick", professional: true, preferences: {"foo"=>"[\"\", \"bar\", \"baz\", \"bak\"]", "goo"=>"[\"\", \"gar\", \"gaz\", \"gak\"]", "too"=>"[\"tar\", \"taz\", \"tak\"]", "preferences"=>"{\"foo\"=>[\"\", \"bar\", \"baz\", \"bak\"], \"goo\"=>[\"\", \"gar\", \"gaz\", \"gak\"], \"too\"=>[\"tar\", \"taz\", \"tak\"]}"}>
irb(main):077:0> plan.preferences
=> {"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"], :preferences=>{"foo"=>["", "bar", "baz", "bak"], "goo"=>["", "gar", "gaz", "gak"], "too"=>["tar", "taz", "tak"]}}
irb(main):083:0> plan_out.preferences
=> {"foo"=>"[\"\", \"bar\", \"baz\", \"bak\"]", "goo"=>"[\"\", \"gar\", \"gaz\", \"gak\"]", "too"=>"[\"tar\", \"taz\", \"tak\"]", "preferences"=>"{\"foo\"=>[\"\", \"bar\", \"baz\", \"bak\"], \"goo\"=>[\"\", \"gar\", \"gaz\", \"gak\"], \"too\"=>[\"tar\", \"taz\", \"tak\"]}"}
irb(main):085:0> plan_out.preferences['foo']
=> "[\"\", \"bar\", \"baz\", \"bak\"]"
irb(main):086:0> plan_out.preferences['foo'].first
=> "["
所以你可以看到计划在它的实例中很好,但是当从数据库中检索时,它被转义并作为字符串出现在 hstore 中。我的计划模型如下所示:
class Plan < ActiveRecord::Base
store_accessor :preferences, :foo, :goo, :too
validates :email, presence:true, email_format:true
validates :professional, :inclusion => {:in => [true, false], :message => "? - Please choose 'Yes' or 'No' for Nutrition Professional"}
end
任何见解都会有所帮助。我是在尝试做一些 Hstore 做不到的事情吗?我不想为这些记录做完整的关系数据库,这似乎是序列化的一个很好的用途。
谢谢!
【问题讨论】:
-
你用的是什么版本?
4.0.0或4.0.1这看起来像错误。但在版本4.0.1中已更正 >4.0.0hstore 默认为序列化。 -
不幸的是,我使用的是 4.0.1,所以我不认为就是这样。
-
与我上面描述的情况相似?在 has 值中使用数组?
标签: ruby postgresql serialization ruby-on-rails-4 hstore