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メソッドのインスタンスメソッドを次のように定義する必要があります。

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 に答える