重命名ActiveResource属性

时间:2011-04-13 20:11:16

标签: ruby-on-rails ruby activeresource

我正在使用来自第三方API的JSON数据,对该数据进行一些处理,然后将模型作为JSON发送到客户端。传入数据的键名称不是很好。其中一些是首字母缩写词,有些似乎是随机字符。例如:

{
  aikd: "some value"
  lrdf: 1 // I guess this is the ID
}

我正在创建一个rails ActiveResource模型来包装这个资源,但不想通过model.lrdf访问这些属性,因为它不是lrdf真正的内容!相反,我想用某种方法将这些属性别名化为另一个名为better的属性。所以我可以说model.id = 1并自动将lrdf设置为1或者放入model.id并自动返回1.此外,当我调用model.to_json将模型发送给客户端时,我不想要我的javascript必须要理解这些奇怪的命名约定。

我试过

alias id lrdf

但是这给了我一个错误,说方法lrdf不存在。

另一种选择是仅包装属性:

def id
  lrdf
end

这样可行,但是当我调用model.to_json时,我再次看到lrdf作为键。

以前有人做过这样的事吗?你推荐什么?

2 个答案:

答案 0 :(得分:1)

你尝试过一些before_save魔法吗?也许您可以定义attr_accessible:ldrf,然后在您的before_save过滤器中,将ldrf分配给您的id字段。没试过,但我认为它应该有用。

attr_accessible :ldrf

before_save :map_attributes

protected
  def map_attributes
    {:ldrf=>:id}.each do |key, value|
      self.send("#{value}=", self.send(key))
    end
  end

让我知道!

答案 1 :(得分:0)

您可以尝试基于ActiveResource :: Formats :: JsonFormat创建格式化程序模块并覆盖decode()。如果必须更新数据,则还必须覆盖encode()。查看本地gems / activeresource-N.N.N / lib / active_resource / formats / json_format.rb以查看原始json格式化程序的功能。

如果您的模型名称为Model且格式化程序为CleanupFormatter,则只需执行Model.format = CleanupFormatter。

module CleanupFormatter
  include ::ActiveResource::Formats::JsonFormat
  extend self
  # Set a constant for the mapping.
  # I'm pretty sure these should be strings. If not, try symbols.
  MAP = [['lrdf', 'id']]

  def decode(json)
    orig_hash = super
    new_hash = {}
    MAP.each {|old_name, new_name| new_hash[new_name] = orig_hash.delete(old_name) }
    # Comment the next line if you don't want to carry over fields missing from MAP
    new_hash.merge!(orig_hash)
    new_hash
  end
end

这并不像你要求的那样涉及别名,但我认为将你的模型中的乱码名称隔离开来是很有帮助的,这些名字永远不会知道那些原始名称。 “to_json”将显示可读的名称。