2016-03-31 5 views
2

Ich möchte jedes JSON-Objekt innerhalb des Aufrufs zu einem Modell speichern, so dass ich die API nicht jedes Mal aufrufen muss, wenn ich die Anwendung geladen habe, stattdessen rufe ich alle Modelle auf Einträge.Speichern Sie jedes JSON-Objekt in einem Modell

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 

Dies ist, was ich in meinem Modell derzeit haben, die perfekt die API-Aufrufe und Anzeigen jeder von ihnen in meiner Ansicht. Offensichtlich ist dies nicht der beste Weg, dies zu tun. Ich möchte jede URL-Eigenschaft von JSON in meinem Modell speichern - nicht ganz sicher, wie ich das machen soll!

+0

Sind Sie mit Postgres für Ihre Datenbank? –

+0

Ja mit Heroku – Jonathan

Antwort

2

Von Ihre Kommentare

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

    def url 
    @info[:url] 
    end 

Um die Info,

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

HStore reference

Wenn Sie ein Bild Modell mit einem Feldnamen zu speichern, die Sie erstellen möchten scheint es, dass Sie für jeden Wert im Antwort-JSON-Objekt eine neue Instanz erstellen möchten.

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 

Dann diese neue Methode zu verwenden ...

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

Sie können ganze JSON in einem Feld von Modell/Tabelle speichern und dann dieselbe JSON von JSON.parse Methode erhalten.

+0

Nicht sicher, ob dies eine Antwort ist? Ich bin auf der Suche nach einer Karte meiner Datenbank. – Jonathan

+0

Sie möchten jedes Attribut des gesamten JSON-Objekts zuordnen? – kurenn

+0

Yep - z.B. 'Name' in JSON zu 'Name' in meiner Modelltabelle – Jonathan

1

Wenn Sie Postgres verwenden (was ich nicht empfehlen würde), können Sie den Hash (statt JSON) in einer HStore-Spalte speichern. Dadurch können Sie alle JSON in einem Feld speichern. Sie haben keinen Namen in Ihrem Code, nennen wir es info.

Um auf die Informationen zuzugreifen, können Sie Methoden definieren. ,

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

Danke für die Antwort in solchen Details, aber ich dachte mehr im Sinne dieser beiden Antworten, ich habe ein paar Leute sagen, dass Postgres Hash-Speicher ist ein schlechter Weg zu mach das. Ähnlich wie diese http://stackoverflow.com/questions/30471957/saving-json-data-to-database-rails-from-url – Jonathan

+0

Wenn Sie wissen, was die Felder sein werden (wie Datum und Nummer), dann könnte ein Modell besser sein. HStore ist großartig, wenn Sie nicht wissen, was die Felder sind. –

+0

Wir werden immer die Felder von dem Service, aus dem wir anrufen, kennen. Wären Sie in der Lage, Ihre Antwort mit einem einfachen JSON-Speicher mit einem Modell zu aktualisieren? z.B. Speichern Sie jede Bild-URL in einem neuen Eintrag? – Jonathan

Verwandte Themen