2

在 Sinatra Web 应用程序中,我试图从 DB 获取数据并将它们转换为 UI 可接受的对象(最后转换为 JSON)。但是 UI 和 DB 字段所需的属性名称存在一些差异。所以我使用了带有别名的 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:可能有一些其他解决方案来提供这种映射(不创建新类和/或添加额外的转换方法) - 比如通过 to_json 方法中的选项影响 json 属性名称等

4

1 回答 1

3

您应该像这样定义 id 和 Alarm methods 实例方法:

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

attr_accessor不起作用,因为它查找实例变量,而不是 @values 哈希中的条目。Sequel::Model#[]在 @values 哈希中查找具有相同名称的条目。

于 2011-05-13T16:22:28.077 回答