Ruby on rails 将json保存到模型和数据库
我正在尝试做一个定制的rake任务,它使用itunesapi按姓名搜索艺术家,如果它存在,它将把数据存储到数据库中 我需要两件事:1)检查艺术家是否存在(我如何检查响应),2)使用ActiveRecord创建它(如果存在) 我不知道如何实现它,下面是我的代码到目前为止的样子。 提前谢谢Ruby on rails 将json保存到模型和数据库,ruby-on-rails,ruby,json,rake,rake-task,Ruby On Rails,Ruby,Json,Rake,Rake Task,我正在尝试做一个定制的rake任务,它使用itunesapi按姓名搜索艺术家,如果它存在,它将把数据存储到数据库中 我需要两件事:1)检查艺术家是否存在(我如何检查响应),2)使用ActiveRecord创建它(如果存在) 我不知道如何实现它,下面是我的代码到目前为止的样子。 提前谢谢 require 'net/http' require 'json' task :artist,[""] do |t, args| request = ITunesSearchAPI.search(:
require 'net/http'
require 'json'
task :artist,[""] do |t, args|
request = ITunesSearchAPI.search(:term => "#{args}")
puts request
end
首先,不要使用request这个词,它是一个保留字,可能会给您带来问题。您可以改为尝试
result
如果没有找到任何内容,您将返回一个空数组
所以你只需要检查一下
result.empty?
如果是基于艺术家的名字,那么搜索是非常直接的
unless Artist.exists?(name: result[0]["artistName"])
Artist.create(name: result[0]["artistName", itunes_id: result[0]["artistId"])
end
因为苹果使用匹配算法,所以你的结果集总是可能返回多个条目,我会再次检查它是否是你首先想要的条目
1) 检查是否存在艺术家(如何检查响应)
这将取决于请求的内容,或者iTunes上没有艺术家时,iTunesArchapi.search
方法的行为。通常,API返回JSON中的空数组。因此,您可以简单地检查结果数组是否为空
# Provided request['artists'] is an array
if request['artists'].empty?
# no artists
else
# there are artists
end
当我们使用它时,您不必插入参数
,只要将它们打印出来,或者如果您想将其转换为字符串
,就可以使用.to_s
方法
ITunesSearchAPI.search(:term => args.to_s)
2) 如果存在,则使用ActiveRecord创建它 您可以在不使用Rails的情况下使用ActiveRecord。它一直是。它归结为安装active_记录gem,包括它,建立连接并从
ActiveRecord::Base
继承
require 'active_record'
require 'sqlite3'
require 'logger'
ActiveRecord::Base.logger = Logger.new('db.log')
ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: 'db/mydb.sqlite3',
timeout: 5000,
pool: 5
)
class YourModel < ActiveRecord::Base
end
需要“活动记录”
需要'sqlite3'
需要“记录器”
ActiveRecord::Base.logger=logger.new('db.log')
ActiveRecord::Base.build\u连接(
适配器:“sqlite3”,
数据库:“db/mydb.sqlite3”,
超时:5000,
游泳池:5
)
类YourModel
响应是什么样的?艺术家模型中到底有什么?我猜你想用。这个宝石已经3年没有更新了,所以我认为它对你不起作用。非常感谢你的回复。很好地了解插值。@ R0UdER,考虑用投票回答作为“谢谢”这样的方式。非常感谢,当你看到正确答案时,看起来总是那么容易:
require 'active_record'
require 'sqlite3'
require 'logger'
ActiveRecord::Base.logger = Logger.new('db.log')
ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: 'db/mydb.sqlite3',
timeout: 5000,
pool: 5
)
class YourModel < ActiveRecord::Base
end