Переименовать ActiveResource свойства - PullRequest
0 голосов
/ 14 апреля 2011

Я потребляю данные JSON из стороннего API, выполняю небольшую обработку этих данных и затем отправляю модели клиенту в виде JSON.Ключи для входящих данных не очень хорошо названы.Некоторые из них являются аббревиатурами, некоторые кажутся случайными символами.Например:

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

Я создаю модель ActiveResource для рельсов, чтобы обернуть этот ресурс, но не хотел бы обращаться к этим свойствам через model.lrdf, так как не совсем очевидно, что такое lrdf на самом деле!Вместо этого я хотел бы каким-то образом связать эти свойства с другим свойством, которое названо лучше.Что-то такое, что я могу сказать 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 ]

1 голос
/ 14 апреля 2011

Вы пробовали какое-то волшебство 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

Дайте мне знать!

0 голосов
/ 14 апреля 2011

Вы можете попробовать создать модуль форматирования на основе ActiveResource :: Formats :: JsonFormat и переопределить decode ().Если вам нужно обновить данные, вам также придется переопределить функцию encode ().Посмотрите на ваш локальный gems / activeresource-NNN / lib / active_resource / format / 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" будет отображать читаемые имена.

...