鉴于以下功能片段,我在减少数据库查询时遇到问题:
class User < ApplicationRecord
belongs_to :account
def self.do_something
self.find_each do |user|
puts "#{self.new.account.name}:#{user.name} did something"
end
end
end
class Account < ApplicationRecord
has_many :users
end
a = Account.first
puts 'starting'
a.users.do_something
帐户加载(0.4ms( 选择"帐户"。 从"帐户",其中 "账户"。id" = $1 限制 $2 [["id", 1], ["限制", 1]]
开始
帐户加载(0.3ms( 选择"帐户"。 从"帐户",其中 "账户"。id" = $1 限制 $2 [["id", 1], ["限制", 1]]
测试:用户做了一些事情
帐户加载(0.3ms( 选择"帐户"。 从"帐户",其中 "账户"。id" = $1 限制 $2 [["id", 1], ["限制", 1]]
测试:用户做了一些事情
帐户加载(0.3ms( 选择"帐户"。 从"帐户",其中 "账户"。id" = $1 限制 $2 [["id", 1], ["限制", 1]]
测试:用户做了一些事情
帐户加载(0.3ms( 选择"帐户"。 从"帐户",其中 "账户"。id" = $1 限制 $2 [["id", 1], ["限制", 1]]
测试:用户做了一些事情
您可以看到,每个用户正在从数据库中获取帐户模型!
我希望在 Singleton 方法中使用类似self.account
的东西来引用原始帐户,但默认情况下显然不存在这种关系,这就是我目前使用self.new.account
的原因。
还有什么地方可以从self.do_something
内部获取保存在a
中的原始帐户模型吗? 我显然可以在参数中传递帐户,但这似乎很乏味,特别是如果我稍后可以添加参数......
在你的find_each
循环中,你应该能够使用user.account
.
在这个循环之外,我不相信有一种记录的/支持的/不会消失的、没有警告的方式来找到对象。根据您的 Rails 版本,类似self.current_scope.proxy_association.owner
的东西可能会给你你需要的答案......但如果可能的话,请更喜欢user.account
:您使用私有 API 的次数越多,未来的升级就越困难。
或者,考虑使用关联扩展仅在has_many
关联中定义do_something
方法 - 如果它不适合称为User.do_something
或User.where(name: "Bob").do_something
(因为它们没有关联的account
(,也许它根本不应该是顶级方法。