2016-03-31 3 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 и отображает каждый из них в моем представлении. Очевидно, что это не самый лучший способ сделать это, я хотел бы сохранить каждое свойство URL JSON в моей модели - не совсем уверен, как это сделать!

+0

Вы используете Postgres для вашей базы данных? –

+0

Да с Heroku – 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 по методу JSON.parse.

+0

Не слишком уверен, что это ответ? Я ищу карту, я думаю, в свою базу данных. – Jonathan

+0

Вы хотите отобразить каждый атрибут всего объекта json? – kurenn

+0

Yep - например. 'name' в JSON для 'name' в моей таблице моделей – Jonathan

1

Если вы используете Postgres (что я бы не рекомендовал), вы можете сохранить хеш (вместо JSON) в столбце HStore. Это позволит вам сохранить все JSON в одном поле. У вас нет имени для этого в вашем коде, поэтому давайте назовем его 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

Спасибо, что ответили на такие детали, но я больше думал о строках этих двух ответов, я видел, как некоторые люди говорят, что хранение хешей Postgres - это плохой способ сделай это. http://stackoverflow.com/questions/30471957/saving-json-data-to-database-rails-from-url – Jonathan

+0

Если вы знаете, какие поля будут (например, дата и номер), то модель может быть лучше. HStore отлично, если вы не знаете, что такое поля. –

+0

Мы всегда будем знать поля из службы, с которой мы звоним. Могли бы вы обновить свой ответ простым сохранением JSON с помощью модели? например сохранить каждый URL изображения в новую запись? – Jonathan