我有一个forEach循环遍历许多对象,然后在数据库中为每个项目创建一条记录。
structure(list(lat = c(53.56478, 53.919724, 54.109047, 54.109047,
54.36612, 55.48143, 56.2335, 56.682796, 56.93616, 57.804092,
58.82089, 59.297623, 59.335075, 59.907795, 60.125046, 60.274445,
60.289204, 60.386665, 60.591167, 64.68329), long = c(14.585611,
14.286517, 13.807847, 13.807847, 10.997632, 18.182697, 16.454927,
16.564703, 18.221214, 23.258204, 17.84381, 18.172949, 18.126884,
23.217615, 20.65724, 26.44062, 27.189545, 19.847534, 28.5585,
24.534185)), .Names = c("lat", "long"), row.names = c(2L, 3L,
6L, 11L, 1L, 17L, 15L, 20L, 13L, 19L, 7L, 14L, 4L, 5L, 10L, 12L,
18L, 9L, 8L, 16L), class = "data.frame")
虽然这确实有效,但它很慢(有些电影有50多个演员,这是对数据库的很多帖子请求)。有没有更好的方法将多个对象保存到数据库中?
这是我的actor控制器中的创建函数,
angular.forEach($scope.movieCredits.credits.cast, function(item){
createActor.create({
name: item.name,
character: item.character,
movie_id: movieRecordID[0].id,
})
})
*更新*
从我的rails控制台登录,
def create
Actor.find_or_create_by(movie_id: params[:movie_id], name: params[:name], character: params[:character])
redirect_to :root
end
答案 0 :(得分:3)
您已使用Ruby on Rails标记了问题,因此我假设您使用的是ActiveRecord。因此,为批量插入构建一个api,如下所示。
您的角度代码应如下所示
var actors = [];
angular.forEach($scope.movieCredits.credits.cast, function(item){
actors.push({
name: item.name,
character: item.character,
movie_id: movieRecordID[0].id,
});
});
createActor.create(actors);
在你的rails控制器中
def create
actors = Actor.create(params[:actors])
..
render json: actors
end
这是活动记录处理插入多个记录的方式,因为create
方法也采用如下数组
Model.create([{name: "John Doe", character: "The Hobbit", movie_id: 1}, {name: "Christian Bale", character: "Batman", movie_id: 2}])
这将针对N条记录执行一个SQL查询,而不是针对N条记录执行N个SQL查询。