如何防止检查父母是否存在对belongs_to

时间:2018-09-24 08:53:16

标签: ruby-on-rails

ActiveRecord在保存或创建子记录时会自动检查是否存在父记录。有办法防止这种检查吗?

例如

class Project
  has_many :projectitems
end

class Projectitem
  belongs_to :project
end

如果我现在执行更新,我会在日志文件中看到

Project Load (0.1ms)  SELECT  `projects`.* FROM `projects` WHERE `projects`.`id` = 49 LIMIT 1
Projectitems Update (0.2ms)  UPDATE `projectitems` SET .....

我不需要检查父记录。我知道它在那里,这个额外的请求只会导致不必要的数据库负载。

1 个答案:

答案 0 :(得分:2)

Rails 5要求:belongs_to关联在默认情况下存在。您看到的额外检查是验证,以确保您的项目仍然存在。

如果要关闭此行为,可以指定该关系为可选:

class Projectitem
  belongs_to :project, optional: true
end

如果要执行此操作,则可能需要一些额外的保护措施,以确保Projectitems不会成为“孤立的”。例如,如果您删除Project,则可能还希望删除所有关联的项目项:

class Project
  has_many :projectitems, dependent: :destroy
end

或者,您可能希望在数据库层将projectitems.project_id标记为外键,它可以提供与Rails默认验证相同的保护级别,但对所有客户端而言(如果您的Rails应用程序特别有用)不是唯一连接到数据库的应用程序。

另一种选择(也是我个人推荐的选择)是不使用Rails的默认设置。当您的其他数据库事务非常简单时,服务器上的负载似乎不成比例,但这确实非常快,而且速度很慢。但是,随着您添加更多字段和索引,您的更新可能会随着时间增长。