Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将多条记录同时保存到数据库中_Ruby On Rails_Angularjs_Database_Activerecord - Fatal编程技术网

Ruby on rails 如何将多条记录同时保存到数据库中

Ruby on rails 如何将多条记录同时保存到数据库中,ruby-on-rails,angularjs,database,activerecord,Ruby On Rails,Angularjs,Database,Activerecord,我有一个forEach,它循环遍历许多对象,然后在数据库中为每个项目创建一个记录 angular.forEach($scope.movieCredits.credits.cast, function(item){ createActor.create({ name: item.name, character: item.character, movie_id: movieRecordID[0].id, }) }) 虽然这确实有效,但速度相当慢(

我有一个forEach,它循环遍历许多对象,然后在数据库中为每个项目创建一个记录

angular.forEach($scope.movieCredits.credits.cast, function(item){
  createActor.create({
    name:       item.name,
    character:  item.character,
    movie_id:   movieRecordID[0].id,
  })
})
虽然这确实有效,但速度相当慢(有些电影有50多名演员,这是对数据库的大量POST请求)。是否有更好的方法将多个对象保存到数据库中

这是我的演员控制器中的创建函数

def create
  Actor.find_or_create_by(movie_id: params[:movie_id], name: params[:name], character: params[:character])
  redirect_to :root
end
*更新*

从我的rails控制台登录

Started POST "/actors.json" for 127.0.0.1 at 2016-01-12 16:15:35 +0100
Processing by ActorsController#create as JSON
  Parameters: {"_json"=>[{"name"=>"John Travolta", "character"=>"Vincent Vega", "movie_id"=>680}, {"name"=>"Samuel L. Jackson", "character"=>"Jules Winfield", "movie_id"=>680}, {"name"=>"Uma Thurman", "character"=>"Mia Wallace", "movie_id"=>680}, {"name"=>"Bruce Willis", "character"=>"Butch Coolidge", "movie_id"=>680}, {"name"=>"Ving Rhames", "character"=>"Marsellus Wallace", "movie_id"=>680}, {"name"=>"Harvey Keitel", "character"=>"Wolf", "movie_id"=>680}, {"name"=>"Eric Stoltz", "character"=>"Lance", "movie_id"=>680}, {"name"=>"Tim Roth", "character"=>"Pumpkin", "movie_id"=>680}, {"name"=>"Amanda Plummer", "character"=>"Honey Bunny", "movie_id"=>680}, {"name"=>"Maria de Medeiros", "character"=>"Fabienne", "movie_id"=>680}, {"name"=>"Quentin Tarantino", "character"=>"Jimmie Dimmick", "movie_id"=>680}, {"name"=>"Christopher Walken", "character"=>"Captain Koons", "movie_id"=>680}, {"name"=>"Rosanna Arquette", "character"=>"Jody", "movie_id"=>680}, {"name"=>"Peter Greene", "character"=>"Zed", "movie_id"=>680}, {"name"=>"Duane Whitaker", "character"=>"Maynard", "movie_id"=>680}, {"name"=>"Angela Jones", "character"=>"Esmarelda Villalobos", "movie_id"=>680}, {"name"=>"Phil LaMarr", "character"=>"Marvin", "movie_id"=>680}, {"name"=>"Steve Buscemi", "character"=>"Buddy Holly", "movie_id"=>680}, {"name"=>"Bronagh Gallagher", "character"=>"Trudi", "movie_id"=>680}, {"name"=>"Laura Lovelace", "character"=>"Waitress", "movie_id"=>680}, {"name"=>"Frank Whaley", "character"=>"Brett", "movie_id"=>680}, {"name"=>"Burr Steers", "character"=>"Roger", "movie_id"=>680}, {"name"=>"Paul Calderon", "character"=>"Paul", "movie_id"=>680}, {"name"=>"Jerome Patrick Hoban", "character"=>"Ed Sullivan", "movie_id"=>680}, {"name"=>"Michael Gilden", "character"=>"Page for Phillip Morris", "movie_id"=>680}, {"name"=>"Gary Shorelle", "character"=>"Ricky Nelson", "movie_id"=>680}, {"name"=>"Susan Griffiths", "character"=>"Marilyn Monroe", "movie_id"=>680}, {"name"=>"Eric Clark", "character"=>"James Dean", "movie_id"=>680}, {"name"=>"Joseph Pilato", "character"=>"Dean Martin", "movie_id"=>680}, {"name"=>"Brad Blumenthal", "character"=>"Jerry Lewis (as Brad Parker)", "movie_id"=>680}, {"name"=>"Lorelei Leslie", "character"=>"Mamie van Doren", "movie_id"=>680}, {"name"=>"Emil Sitka", "character"=>"Hold Hands You Lovebirds (archive footage)", "movie_id"=>680}, {"name"=>"Brenda Hillhouse", "character"=>"Mrs. Coolidge - Butch's Mother", "movie_id"=>680}, {"name"=>"Chandler Lindauer", "character"=>"Young Butch", "movie_id"=>680}, {"name"=>"Sy Sher", "character"=>"Klondike", "movie_id"=>680}, {"name"=>"Robert Ruth", "character"=>"Sportscaster #1 - Coffee Shop", "movie_id"=>680}, {"name"=>"Rich Turner", "character"=>"Sportscaster #2", "movie_id"=>680}, {"name"=>"Don Blakely", "character"=>"Wilson's Trainer", "movie_id"=>680}, {"name"=>"Carl Allen", "character"=>"Dead Floyd Wilson", "movie_id"=>680}, {"name"=>"Karen Maruyama", "character"=>"Gawker #1", "movie_id"=>680}, {"name"=>"Kathy Griffin", "character"=>"Hit-and-run Witness", "movie_id"=>680}, {"name"=>"Venessia Valentino", "character"=>"Pedestrian / Bonnie Dimmick", "movie_id"=>680}, {"name"=>"Linda Kaye", "character"=>"Shot Woman", "movie_id"=>680}, {"name"=>"Stephen Hibbert", "character"=>"The Gimp", "movie_id"=>680}, {"name"=>"Alexis Arquette", "character"=>"Man No. 4", "movie_id"=>680}, {"name"=>"Julia Sweeney", "character"=>"Raquel", "movie_id"=>680}, {"name"=>"Lawrence Bender", "character"=>"Long Hair Yuppy Scum", "movie_id"=>680}, {"name"=>"Cie Allman", "character"=>"Winston Wolfe's Girlfriend At Party (uncredited)", "movie_id"=>680}, {"name"=>"Rene Beard", "character"=>"Bar Tender (uncredited)", "movie_id"=>680}, {"name"=>"Lori Pizzo", "character"=>"Lucky Lady (uncredited)", "movie_id"=>680}, {"name"=>"Glendon Rich", "character"=>"Drug Dealer (uncredited)", "movie_id"=>680}, {"name"=>"Devan Richardson", "character"=>"Hopalong Cassidy (uncredited)", "movie_id"=>680}, {"name"=>"Ani Sava", "character"=>"Woman in Bathroom (uncredited)", "movie_id"=>680}], "actor"=>{}}
  User Load (2.8ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
  SQL (0.2ms)  INSERT INTO "actors" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2016-01-12 15:15:35.503383"], ["updated_at", "2016-01-12 15:15:35.503383"]]
   (11.9ms)  commit transaction
Redirected to http://localhost:3000/
Completed 302 Found in 31ms (ActiveRecord: 15.0ms)

您已经用RubyonRails标记了这个问题,所以我假设您使用的是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
这是active records处理插入多个记录的方式,因为
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查询。

为什么不创建一个循环来构建数据,然后每个20或30个cast成员发送一个大的insert查询?@Gal这会导致创建一条记录吗?那么每个参与者的名字和字符值将存储在一个记录中?现在的结果是多条记录,而不是多条记录?SQL Server示例
插入表(第1列,第2列)值(Value1,Value2),(Value1,Value2)
这将插入多条记录records@Malkus我能做什么呢?我建议在后端使用某种ORM。然后(对于大多数ORM),您需要做的就是提供一个多维数组(当然正确映射)到insert方法,然后您就可以。。。但是您仍然需要散列数据(散列为数组中的数据)…因此您通过.push填充空的actor数组,这会将每个项推入actor数组,对吗?然后使用该数组使用
createActor
服务发布?我已经试过了,在rails日志中我看到了所有的演员等等,但是我的演员表仍然是空的。我想这是因为我的rails控制器中的create函数。我已经把它添加到我的问题中,也许你可以看看我的直觉是否正确?无论如何,感谢您提供的见解。
find_或\u create_by
查找或创建单个记录,并且不能获取数组。您必须使用
create
方法并通过验证处理重复项。好的,但是如何将参数添加到
create
方法?我现在有了这个,
actors=Actor.create(Actor\u params)
private def Actor\u params.permit(:name,:character,:movie\u id)end
创建了一些新记录,但它是空的。现在你的参数是数组了,你不再允许
:name,:character,:movie\u id
。您可以用发送到后端的参数进行注释吗?好的,那么rails如何知道应该插入哪些值呢?我在问题中添加了创建操作的结果。