我的"{\"en\":\"Lorem\"}"
我想将此保存在我的question.name
字段中,这是postgres jsonb类型。
class Question < ActiveRecord::Base
serialize :name
end
# db/schema.rb
create_table "preset_questions", force: :cascade do |t|
t.jsonb "name", default: {}
end
我尝试过以下方法:
question.update(name:"{\"en\":\"Lorem\"}")
question.update(name:JSON.parse("{\"en\":\"Lorem\"}"))
两者的结果:
question.name
=> nil
答案 0 :(得分:4)
通过删除serialize :name
来实现目标。看起来rails已经知道该做什么,因为列类型是jsonb
class Question < ActiveRecord::Base
end
# db/schema.rb
create_table "preset_questions", force: :cascade do |t|
t.jsonb "name", default: {}
end
question.update(name:"{\"en\":\"Lorem\"}")
question.update(name:JSON.parse("{\"en\":\"Lorem\"}"))
两者都返回
question.name
=> {"en"=>"lorem", "id"=>"ipsum"}
答案 1 :(得分:1)
在Rails中,您可以在ActiveRecord模型中指定它必须在保存列之前对其进行序列化,并在读取后对其进行反序列化。它使您能够将任何结构保存在数据库的字符串列中。
class Question < ActiveRecord::Base
serialize :name
end
然后您可以像这样保存哈希:
question.update(name: {en: "Lorem"} }
文档:http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html