Ruby on rails 在一个声明中使用ActiveRecord序列化多个属性?

Ruby on rails 在一个声明中使用ActiveRecord序列化多个属性?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个大约有10个属性的模型,我希望在我的数据库中序列化为JSON 有没有办法做到: serialize attribute1, JSON // ... serialize attribute10, JSON 一行?因为序列化[attribute1,…,attribute10],JSON不起作用 谢谢 抱歉,根据文档,不确定这是否可以开箱即用: 否则,您可能会创建一个模块来覆盖ActiveRecord并执行您希望它执行的操作。抱歉,根据文档,不确定是否可以立即执行此操作: 否则,您可能会创建

我有一个大约有10个属性的模型,我希望在我的数据库中序列化为JSON

有没有办法做到:

serialize attribute1, JSON
// ...
serialize attribute10, JSON
一行?因为序列化[attribute1,…,attribute10],JSON不起作用


谢谢

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


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

抱歉,根据文档,不确定是否可以立即执行此操作:


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

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

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

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

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

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

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

根据您在这里尝试的操作,您可能更适合:

Rails将使用一个列来存储和序列化多个属性,它将为每个属性定义访问器,这样您仍然可以像访问单个列一样访问它们

我之所以提出这一点,是因为在数据库中使用单独的列不太可能获得任何额外的价值,因为大多数关系数据库都没有对它做任何特殊的处理。您的应用程序效率更高,并且当您添加另一个需要类似处理的项时,不必一直向数据库添加列

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

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

store :settings, accessors: [ :attr1, :attr2, :attr3 ], coder: JSON

根据您在这里的尝试,您可能更适合以下方式:

Rails将使用一个列来存储和序列化多个属性,它将为每个属性定义访问器,这样您仍然可以像访问单个列一样访问它们

我之所以提出这一点,是因为在数据库中使用单独的列不太可能获得任何额外的价值,因为大多数关系数据库都没有对它做任何特殊的处理。您的应用程序效率更高,并且当您添加另一个需要类似处理的项时,不必一直向数据库添加列

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

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

store :settings, accessors: [ :attr1, :attr2, :attr3 ], coder: JSON

如果方便确实值得,您可以定义一种新方法来更优雅地处理此问题:

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

主要是偏好问题。如果您在应用程序中的其他地方使用此功能,您还可以继续将其包含到ActiveRecord::Base中。

如果您觉得方便是值得的,您可以定义一种新方法来更优雅地处理此功能:

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

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

实际上,您可能可以执行类似%wattr1 attr2 attr3的操作。每个{attr | serialize attr,JSON}这很有帮助,谢谢。还有,zeantsoi,我知道它是如何工作的,没有一个答案是好的,今天早上我只有机会尝试user1376019的推荐。实际上,你可能可以做一些类似%wattr1 attr2 attr3的事情。每个{attr | serialize attr,JSON}这很有帮助,谢谢。还有,zeantsoi,我知道它是如何工作的,没有一个答案是好的,今天早上我只有机会尝试一下user1376019的推荐。这太棒了。非常感谢。但这不是我想要的。将来肯定会用到这个。这太棒了。非常感谢。但这不是我想要的。将来肯定会用到这个。