Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Rails序列化将哈希保存到数据库_Ruby On Rails_Ruby_Serialization_Activerecord - Fatal编程技术网

Ruby on rails 使用Rails序列化将哈希保存到数据库

Ruby on rails 使用Rails序列化将哈希保存到数据库,ruby-on-rails,ruby,serialization,activerecord,Ruby On Rails,Ruby,Serialization,Activerecord,我正在尝试将哈希映射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 输出为假。这里出了什么问题?列类型

我正在尝试将哈希映射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

输出为假。这里出了什么问题?

列类型错误。您应该使用文本而不是字符串。因此,您的迁移应该是:

 def self.up
   add_column :users, :multi_wrong, :text
 end

然后Rails将为您正确地将其转换为YAML(并执行正确的序列化)。字符串字段的大小有限,只能保存特别小的值。

更新:

class User < ActiveRecord::Base
  serialize :location_data
end
b = User.new
b.location_data = [1,2,{foot: 3, bart: "noodles"}]
b.save
具体实现将取决于您的数据库,但PostgreSQL现在有
json
jsonb
列,它们可以本机存储您的哈希/对象数据并允许您

更改迁移,就完成了

class Migration0001
  def change
    add_column :users, :location_data, :json, default: {}
  end
end
原件:

class User < ActiveRecord::Base
  serialize :location_data
end
b = User.new
b.location_data = [1,2,{foot: 3, bart: "noodles"}]
b.save
有关更多详细信息:&&

确保您的列是
:text
,而不是
:string

迁移:

class User < ActiveRecord::Base
  serialize :location_data
end
b = User.new
b.location_data = [1,2,{foot: 3, bart: "noodles"}]
b.save
$rails g迁移将位置数据添加到用户位置数据: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
class AddHstore
使用hstore,您可以在序列化字段上设置属性

class User < ActiveRecord::Base  
  # setup hstore
  store_accessor :location_data, :city, :state
end
class用户
Rails 4有一个新功能,名为,因此您可以轻松地使用它来解决问题。您可以为它定义一个访问器,建议您将用于序列化存储的数据库列声明为文本,这样就有足够的空间。最初的例子是:

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'
class用户“丹麦”
u、 设置['country']#=>'Denmark'

尝试保存记录后,user.errors中是否有任何内容?将来,您可以使用bang方法(save!)引发异常并显示错误消息。Best answer现在使用JSON列@BenjaminTan它背后的原因是什么,为什么我不能将哈希存储在“string”数据类型中。因为在数据库中,字符串的固定长度是255(我想)。但是,如果要序列化比较大小的散列,则很容易超过长度。阵列也是如此。文本允许更大的长度。真是太棒了!谢谢