1

Datamapper を ORM として使用して Rails 3 アプリケーションを作成しています。検索にElasticSearchを使用することを検討していますが、ActiveRecordに依存しているように見えるため、Tire gemを使用できません。

RestClient を使用してリクエストを ElasticSearch に送信していますが、Ruby でのレスポンスの解析に問題があります。

GET リクエスト " http://localhost:9200/twitter/tweet/2" を送信すると、ブラウザに次のように表示されます。

{
  "_index": "twitter",
  "_type": "tweet",
  "_id": "2",
  "_version": 3,
  "exists": true,
  "_source": {
    "user": "kimchy",
    "post_date": "2009-11-15T14:12:12",
    "message": "kimchy kimchy says"
  }
}

Rails では、次のように入力すると:

response = RestClient.get 'http://localhost:9200/twitter/tweet/2',{:content_type => :json, :accept => :json}

私はこの結果を得ます:

{
  "_index": "twitter",
  "_type": "tweet",
  "_id": "2",
  "_version": 3,
  "exists": true,
  "_source": {
    "user": "kimchy",
    "post_date": "2009-11-15T14:12:12",
    "message": "kimchy kimchy says"
  }
}

これは正しいように見えますが、JSON の場合のようにドット表記を使用してデータを取得することはできません。

たとえばresponse._type、未定義のメソッド エラーが発生して記述できません。

これについて何か助けていただければ幸いです。

4

2 に答える 2

2

手動で変換する場合は、json からの応答を解析し、それを手動でオブジェクトに変換して、ドット表記のフィールドにアクセスできます。

このようなもの:

require 'json'
require 'ostruct'

response = RestClient.get '...url...'
o = OpenStruct.new(JSON.parse(response))

o._type次に、またはでフィールドにアクセスできるはずですo.message

于 2012-05-09T13:38:21.560 に答える
0

おそらく、あなたが探しているものよりも広い答えが…</p>

この要旨のようなものを使用して、RestClient 呼び出しを ElasticSearch にラップします。JSON 出力を解析し、RestClient の例外の一部をレスキューして、サーバー出力を解析し、クライアント コードに渡します。

要約版は次のとおりです。

# url and method are provided as a param
options = { url: '...', method: '...' }

# default options
options = {
  headers: {
    accept:       :json,
    content_type: :json
  },
  open_timeout: 1,
  timeout:      1
}

begin
  request  = RestClient::Request.new(options)
  response = request.execute
  JSON.parse(response.to_str)

rescue RestClient::BadRequest => e # and others...
  # log e.message
  JSON.parse(e.response.to_str)
end

最後に、ElasticSearch の JSON 応答から解析されたハッシュを取得します。

これらすべてが DataMapper とどのように相互作用するかは、私の通常の経験から少し外れていますが、コメントで明確にしたり、さらに質問したりしてください。

于 2012-05-09T21:46:59.620 に答える