如何将多个记录一次保存到数据库中

时间:2016-01-12 12:13:34

标签: ruby-on-rails angularjs database activerecord

我有一个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

1 个答案:

答案 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查询。