Ruby on rails Rails进行三次db调用以保存一个关联
我有一个非常长的方法,可以创建一组团队。每个团队与多个用户关联。在方法完成并且团队最终确定之后,我尝试用尽可能少的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
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]]