Ruby on rails Rails进行三次db调用以保存一个关联

Ruby on rails Rails进行三次db调用以保存一个关联,ruby-on-rails,sqlite,activerecord,Ruby On Rails,Sqlite,Activerecord,我有一个非常长的方法,可以创建一组团队。每个团队与多个用户关联。在方法完成并且团队最终确定之后,我尝试用尽可能少的db调用保存所有这些信息 协会: class Team < ApplicationRecord belongs_to :objective belongs_to :consultancy has_one :seminar, :through => :consultancy belongs_to :consultant, class_nam

我有一个非常长的方法,可以创建一组团队。每个团队与多个用户关联。在方法完成并且团队最终确定之后,我尝试用尽可能少的db调用保存所有这些信息

协会:

class Team < ApplicationRecord
    belongs_to :objective
    belongs_to :consultancy
    has_one :seminar, :through => :consultancy
    belongs_to  :consultant, class_name: "Student"
    has_and_belongs_to_many  :users
end 

class User < Application 
    attr_accessor       :remember_token, :activation_token, :reset_token
    before_save         :downcase_stuff
    before_validation   :check_title, :check_user_number, :check_username, :check_password
    before_create       :create_activation_digest
    after_create        :update_last_login

    has_and_belongs_to_many  :teams
end
下面是我在本地服务器上运行此代码时读取sql的示例。这只是为其中一个团队准备的。所有这一切都在我试图拯救的12支球队中重复

  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."username" = ? LIMIT ?  [["username", "jo16"], ["LIMIT", 1]]
  User Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example-22@railstutorial.org"], ["id", 16], ["LIMIT", 1]]
  Student Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE "users"."type" IN ('Student') AND "users"."username" = ? AND ("users"."id" != ?) LIMIT ?  [["username", "jo16"], ["id", 16], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."username" = ? LIMIT ?  [["username", "kg19"], ["LIMIT", 1]]
  User Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example-25@railstutorial.org"], ["id", 19], ["LIMIT", 1]]
  Student Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE "users"."type" IN ('Student') AND "users"."username" = ? AND ("users"."id" != ?) LIMIT ?  [["username", "kg19"], ["id", 19], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."username" = ? LIMIT ?  [["username", "es32"], ["LIMIT", 1]]
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example-38@railstutorial.org"], ["id", 32], ["LIMIT", 1]]
  Student Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE "users"."type" IN ('Student') AND "users"."username" = ? AND ("users"."id" != ?) LIMIT ?  [["username", "es32"], ["id", 32], ["LIMIT", 1]]
  SQL (0.1ms)  INSERT INTO "teams" ("consultancy_id", "objective_id", "consultant_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["consultancy_id", 66], ["objective_id", 2], ["consultant_id", 16], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]
  SQL (0.1ms)  INSERT INTO "teams_users" ("user_id", "team_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["user_id", 16], ["team_id", 311], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]
  SQL (0.1ms)  INSERT INTO "teams_users" ("user_id", "team_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["user_id", 19], ["team_id", 311], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]
  SQL (0.1ms)  INSERT INTO "teams_users" ("user_id", "team_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["user_id", 32], ["team_id", 311], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]
因此,似乎团队中的每个成员都有三次单独的通话。一个表示“用户负载”,一个表示“用户存在”,一个表示“学生存在”。我还尝试在调用此方法之前加载用户,但我可能没有正确地这样做

我可以减少这里的通话吗?在这个问题中,还有什么其他信息对我有用


提前感谢您提供的任何见解。

因此,根据您的问题,您需要保存团队和团队用户??此外,请共享关联这些调用很可能来自验证。请张贴您在提到的模型中给出的验证和回调。@AniketShivamTiwari是的。团队拥有很多用户,并且属于很多用户。我还建立了一个团队用户表。如果删除此表,是否可以提高性能?我更新了该问题,以包括团队模型及其关联。当您使用rails CLI添加外键时,默认情况下也会在该外键上添加索引。因此,在保存关联记录(本例中为团队用户)时,它会自动验证关联记录(本例中为用户)的存在@JeffZivkovic您可以这样做,但我不建议这样做。这一呼吁是值得的。
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."username" = ? LIMIT ?  [["username", "jo16"], ["LIMIT", 1]]
  User Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example-22@railstutorial.org"], ["id", 16], ["LIMIT", 1]]
  Student Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE "users"."type" IN ('Student') AND "users"."username" = ? AND ("users"."id" != ?) LIMIT ?  [["username", "jo16"], ["id", 16], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."username" = ? LIMIT ?  [["username", "kg19"], ["LIMIT", 1]]
  User Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example-25@railstutorial.org"], ["id", 19], ["LIMIT", 1]]
  Student Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE "users"."type" IN ('Student') AND "users"."username" = ? AND ("users"."id" != ?) LIMIT ?  [["username", "kg19"], ["id", 19], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."username" = ? LIMIT ?  [["username", "es32"], ["LIMIT", 1]]
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example-38@railstutorial.org"], ["id", 32], ["LIMIT", 1]]
  Student Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE "users"."type" IN ('Student') AND "users"."username" = ? AND ("users"."id" != ?) LIMIT ?  [["username", "es32"], ["id", 32], ["LIMIT", 1]]
  SQL (0.1ms)  INSERT INTO "teams" ("consultancy_id", "objective_id", "consultant_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["consultancy_id", 66], ["objective_id", 2], ["consultant_id", 16], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]
  SQL (0.1ms)  INSERT INTO "teams_users" ("user_id", "team_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["user_id", 16], ["team_id", 311], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]
  SQL (0.1ms)  INSERT INTO "teams_users" ("user_id", "team_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["user_id", 19], ["team_id", 311], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]
  SQL (0.1ms)  INSERT INTO "teams_users" ("user_id", "team_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["user_id", 32], ["team_id", 311], ["created_at", 2019-11-07 03:57:17 UTC], ["updated_at", 2019-11-07 03:57:17 UTC]]