2016-03-31 12 views
2

モデルへの呼び出し内に各JSONオブジェクトを保存するようにしていますので、アプリケーションを読み込むたびにAPIを呼び出す必要はなく、すべてのモデルを呼び出しますエントリ。各JSONオブジェクトをモデルに保存する

require 'httparty' 
require 'json' 

class Feed < ActiveRecord::Base 
    include HTTParty 
    base_uri 'https://www.parsehub.com/api/v2/projects' 

    # GET /feeds 
    # GET /feeds.json 
    def boom 
    response = self.class.get("/tVv8nTahbhgkyIUW8ByCe0-7/last_ready_run/data?&format=json") 
    @elements = response.parsed_response["image"] 
    @parsed = @elements.collect { |e| e['url'] } 
    end 

これは私のモデル内にあります。これは、APIを完全に呼び出して、それぞれのビューを自分のビュー内に表示します。明らかに、これはこれを行う最大の方法ではありません。JSONの各URLプロパティをモデルに保存したいと思います。これを行う方法については完全にはわかりません。

+0

あなたのデータベースのためのPostgresを使用していますか? –

+0

ありがとうございます – Jonathan

答えて

2

あなたのコメントから、レスポンスJSONオブジェクトの各値に対して新しいインスタンスを作成する必要があるようです。

require 'httparty' 
require 'json' 

class Feed < ActiveRecord::Base 
    include HTTParty 
    base_uri 'https://www.parsehub.com/api/v2/projects' 

    has_many :image_urls 

    def fetch_image_urls 
    response = self.class.get("/tVv8nTahbhgkyIUW8ByCe0-7/last_ready_run/data?&format=json") 
    @elements = response.parsed_response["image"] 

    @elements.map do |image_info| 
     self.image_urls.create(url: image_info['url']) 
    end 
    end 
end 


class ImageUrl < ActiveRecord::Base 
    belongs_to :feed 

    # add_colum(:image_urls, :url, :string) 
end 

次に、この新しいメソッドを使用する ...

feed = Feed.find(id) 
feed.image_urls # => [] 
feed.fetch_image_urls # => [<ImageUrl url:http://example.com>, ...] 
feed.image_urls # => [<ImageUrl url:http://example.com>, ...] 
0

モデル/テーブルのフィールドにJSON全体を保存し、JSON.parseメソッドで同じJSONを取得できます。

+0

これが答えなのかどうか分からないのですか?私は私のデータベースに考えてマップを探しています。 – Jonathan

+0

jsonオブジェクト全体の各属性をマップしたいですか? – kurenn

+0

Yep - たとえば – Jonathan

1

Postgresを使用している場合(私はお勧めしません)、HStore列に(JSONの代わりに)ハッシュを保存することができます。これにより、すべてのJSONを1つのフィールドに保存することができます。あなたのコードには名前がありませんので、infoとしましょう。

情報にアクセスするには、メソッドを定義することができます。

class Feed < ActiveRecord::Base 
    def image 
    @info[:image] 
    end 

    def url 
    @info[:url] 
    end 

情報を保存するには、

def boom 
    ... 
    @parsed = @elements.collect { |e| e['url'] } 
    @info = @parsed 
    save 
end 

HStore reference

あなたが作成したいフィールド名を持つイメージ・モデルを持っている場合は、

def boom 
    ... 
    @elements = response.parsed_response["image"] 
    @image_urls = @elements.collect { |e| e['url'] } 

    @image_urls.each do |url| 
    Image.create(url:url) 
    end 
end 
+0

JSONで 'name'を 'name'に設定してください。このような詳細についてはお返事ありがとうございますが、私はこれら2つの答えのラインに沿ってもっと考えていました。これを行う。 類似したもの http://stackoverflow.com/questions/30471957/saving-json-data-to-database-rails-from-url – Jonathan

+0

フィールドがどのようなものになるかを知っている場合(日付と番号)、モデルが良いかもしれません。あなたがフィールドが何であるかわからない場合、HStoreは素晴らしいです。 –

+0

私たちは電話をしているサービスのフィールドを常に知っています。モデルを使った簡単なJSONの保存であなたの答えを更新できるでしょうか?例えば各画像のURLを新しいエントリに保存しますか? – Jonathan

関連する問題