将每个JSON对象保存到模型中

时间:2016-03-31 11:21:31

标签: ruby-on-rails ruby json ruby-on-rails-3

我希望在模型调用中保存每个JSON对象,这样我每次加载应用程序时都不必调用API,而是调用所有模型条目。

ArrayList<String[]> data = (ArrayList<String[]>) getIntent().getSerializableExtra(EXTRA_MESSAGE);

这是我目前在我的模型中所拥有的,它完美地调用API并在我的视图中显示它们中的每一个。显然这不是最好的方法,我想将每个JSON的URL属性保存到我的模型中 - 不完全确定如何执行此操作!

3 个答案:

答案 0 :(得分: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>, ...]

答案 1 :(得分:1)

如果您使用的是Postgres(我不推荐),您可以在HStore列中存储哈希(而不是JSON)。这将允许您将所有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

答案 2 :(得分:0)

您可以将整个JSON保存在模型/表的字段中,然后可以通过JSON.parse方法获得相同的JSON。