1

I have a model with about 10 attributes that I wish to have serialized as JSON in my DB.

Is there a way to do:

serialize attribute1, JSON
// ...
serialize attribute10, JSON

In a single line? Because serialize [attribute1, ..., attribute10], JSON doesn't work.

Thanks!

4

4 回答 4

8

根据您在此处尝试执行的操作,您实际上可能更适合store

store :settings, accessors: :attr1, :attr2, :attr3

Rails 将使用单个列来存储(和序列化)多个属性,并且将为每个属性定义访问器,因此您仍然可以访问它们,就像它们是单独的列一样。

我提出这个的原因是因为在数据库中使用单独的列相对不太可能获得任何额外的价值,因为大多数关系数据库不会对它做任何特别的事情。您的应用程序效率更高,当您添加另一个需要类似处理的项目时,您不必继续向数据库添加列。

我使用这种模式来存储与用户相关的社交 url。当下一个网络出现时,我只需添加一个访问器和一个表单字段,我们就设置好了,不需要迁移。


顺便说一句,Rails 4 还支持指定使用的编码器。IE:

store :settings, accessors: [ :attr1, :attr2, :attr3 ], coder: JSON
于 2013-06-25T15:48:39.563 回答
1

抱歉,根据文档,不确定这是开箱即用的:

http://apidock.com/rails/ActiveRecord/AttributeMethods/Serialization/ClassMethods/serialize

否则,您可能会创建一个覆盖 ActiveRecord 并执行您希望它执行的操作的模块。

于 2013-06-13T21:04:06.977 回答
0

如果方便对您来说真的值得,您可以定义一个新方法来更优雅地处理它:

module SerializeAll
  def serialize_all(*columns)
    store = columns.last.is_a?(Module) ? columns.pop : JSON

    columns.each do |column|
      serialize column, store
    end
  end
end

class Model < ActiveRecord::Base
  extend SerializeAll
  serialize_all :attr1, :attr2, :attr3, JSON
end

serialize这与您考虑 splat具有相同的数量,但也有些令人困惑。serialize_all与 Ruby(和 Rails)中的许多其他方法更一致的另一种实现方式是使用extract_options!which 将从数组末尾提取一个哈希(如果存在):

def serialize_all(*columns)
  options = columns.extract_options!
  # ... serialize(column, options[:store])
end

serialize_all :attr1, :attr2, :attr3, store: JSON

主要只是偏好问题。如果您在应用程序的其他地方使用它,您也可以继续并将其包含到ActiveRecord::Base.

于 2013-06-27T16:53:01.877 回答
0

根据建议,我使用的解决方案如下user1376019

json_exclusions = ["id", "column_not_serialized"]
YourModel.column_names.reject{|col| json_exclusions.include?(col)}.each{|attr| serialize attr, JSON}

我走这条路是因为我正在使用的模型的大多数属性都是序列化的,但是您可能会发现直接列出序列化的属性会更有效。

于 2013-06-25T15:38:51.867 回答