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

Save each JSON object to a model

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

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 属性 保存到我的模型中 - 不完全确定如何去做!

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

如果您使用的是 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

根据您的评论,您似乎想为响应 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>, ...]