我尝试将哈希映射ID保存到我的rails应用程序中的多次尝试。我迁移到数据库以容纳这个新列:
class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end
def self.down
remove_column :users, :multi_wrong
end
end
在我的模特中,我有:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
但是当我使用rails控制台来测试时:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
输出为false。这里出了什么问题?
答案 0 :(得分:172)
列类型错误。您应该使用Text而不是String。因此,您的迁移应该是:
def self.up
add_column :users, :multi_wrong, :text
end
然后Rails会正确地将它转换为YAML(并执行正确的序列化)。字符串字段的大小有限,只会包含特别小的值。
答案 1 :(得分:65)
<强>更新:强>
确切的实现将取决于您的数据库,但PostgreSQL现在有json
和jsonb
列,可以本地存储您的哈希/对象数据,并允许您query against the JSON with ActiveRecord!
更改您的迁移,您就完成了。
class Migration0001
def change
add_column :users, :location_data, :json, default: {}
end
end
<强> ORIGINAL:强>
详细信息: rails docs &amp;&amp;的 apidock 强>
确保您的专栏为:text
而不是:string
<强>迁移:强>
$ rails g migration add_location_data_to_users location_data:text
应该创建:
class Migration0001
def change
add_column :users, :location_data, :text
end
end
你的班级会是这样的:
class User < ActiveRecord::Base
serialize :location_data
end
可用操作:
b = User.new
b.location_data = [1,2,{foot: 3, bart: "noodles"}]
b.save
更棒真棒?!
利用postgresql hstore
class AddHstore < ActiveRecord::Migration
def up
enable_extension :hstore
end
def down
disable_extension :hstore
end
end
class Migration0001
def change
add_column :users, :location_data, :hstore
end
end
使用hstore,您可以在序列化字段
上设置属性class User < ActiveRecord::Base
# setup hstore
store_accessor :location_data, :city, :state
end
答案 2 :(得分:17)
Rails 4有一个名为Store的新功能,因此您可以轻松使用它来解决您的问题。您可以为它定义一个访问器,建议您将用于序列化商店的数据库列声明为文本,因此有足够的空间。最初的例子:
class User < ActiveRecord::Base
store :settings, accessors: [ :color, :homepage ], coder: JSON
end
u = User.new(color: 'black', homepage: '37signals.com')
u.color # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor
# There is no difference between strings and symbols for accessing custom attributes
u.settings[:country] # => 'Denmark'
u.settings['country'] # => 'Denmark'