Сиквел JsonSerializer конфликтует с псевдонимами - PullRequest
2 голосов
/ 13 мая 2011

В веб-приложении Sinatra я пытаюсь получить данные из БД и преобразовать их в объект, приемлемый для пользовательского интерфейса (и, наконец, в JSON).Но есть некоторые различия в именах атрибутов, необходимых для полей пользовательского интерфейса и БД.Поэтому я использовал запрос Sequel с псевдонимами:

Sequel::Model.plugin :json_serializer

class Alarm < Sequel::Model
#       attr_accessor :id, :Alarm
end
filter = Alarm.filter(:NEName => params[:name]).select(:AlarmNo___id, :AlarmMsg___Alarm).all

Но когда я пытаюсь сделать это преобразование:

res = filter.to_json

Я получаю: **undefined method** 'id' for # Alarm:0x000000027403e0


Я также попытался добавить средства доступа к модели (см. Закомментированную строку) attr_accessor :id, :Alarm и получил много объектов, подобных этому: {"json_class":"Alarm","id":null,"Alarm":null}, что выглядит логичным результатом.


Итак, Q1 : как заставить псевдоним сиквела работать с плагином json_serializer?

Q2 : Возможно, могут быть другие решения для обеспечения этого отображения (без создания новогоклассы и / или добавление дополнительных методов преобразования) - например, влияние на имя атрибутов json с помощью параметров в методе to_json и т. д.

1 Ответ

3 голосов
/ 13 мая 2011

Вы должны определить методы экземпляра методов id и Alarm следующим образом:

class Alarm < Sequel::Model
  def id() self[:id] end
  def Alarm() self[:Alarm] end
end

attr_accessor не работает, потому что он ищет переменные экземпляра, а не записи в хеше @values. Sequel::Model#[] ищет в хэше @values ​​запись с таким же именем.

...