【问题标题】:Save each JSON object to a model将每个 JSON 对象保存到模型
【发布时间】:2016-03-31 11:21:30
【问题描述】:

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

【问题讨论】:

  • 你的数据库使用 Postgres 吗?

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


【解决方案1】:

从您的 cmets 看来,您似乎想为响应 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>, ...]

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您如此详细地回答,但我更多地考虑这两个答案,我看到一些人说 Postgres 哈希存储是一种不好的方法。类似于这些stackoverflow.com/questions/30471957/…
    • 如果您知道字段将是什么(例如日期和数字),那么模型可能会更好。如果您不知道这些字段是什么,HStore 就很棒。
    • 我们将始终知道我们调用的服务中的字段。您能否使用带有模型的简单 JSON 保存来更新您的答案?例如将每个图像 url 保存到一个新条目中?
    【解决方案3】:

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

    【讨论】:

    • 不太确定这是否是一个答案?我正在寻找将我认为的映射到我的数据库。
    • 你想映射整个json对象的每个属性?
    • 是的 - 例如JSON 中的“名称”到模型表中的“名称”
    猜你喜欢
    • 2018-01-04
    • 2015-03-17
    • 1970-01-01
    • 2014-08-30
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多