将每个 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
如果您有一个带有要创建的字段名称的图像模型,
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>, ...]
我希望在对模型的调用中保存每个 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
如果您有一个带有要创建的字段名称的图像模型,
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>, ...]