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 .....
我不需要检查父记录。我知道它在那里,这个额外的请求只会导致不必要的数据库负载。
答案 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的默认设置。当您的其他数据库事务非常简单时,服务器上的负载似乎不成比例,但这确实非常快,而且速度很慢。但是,随着您添加更多字段和索引,您的更新可能会随着时间增长。