鉴于以下功能片段,我在减少数据库查询方面遇到了麻烦:
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)从“帐户”中选择“帐户”。* “ accounts”。“ id” = $ 1 LIMIT $ 2 [[“ id”,1],[“ LIMIT”,1]]
开始
帐户加载(0.3毫秒),在“帐户”中选择“帐户”。* “ accounts”。“ id” = $ 1 LIMIT $ 2 [[“ id”,1],[“ LIMIT”,1]]
测试:用户做了什么
帐户加载(0.3毫秒),在“帐户”中选择“帐户”。* “ accounts”。“ id” = $ 1 LIMIT $ 2 [[“ id”,1],[“ LIMIT”,1]]
测试:用户做了什么
帐户加载(0.3毫秒),在“帐户”中选择“帐户”。* “ accounts”。“ id” = $ 1 LIMIT $ 2 [[“ id”,1],[“ LIMIT”,1]]
测试:用户做了什么
帐户加载(0.3毫秒),在“帐户”中选择“帐户”。* “ accounts”。“ id” = $ 1 LIMIT $ 2 [[“ id”,1],[“ LIMIT”,1]]
测试:用户做了什么
您可以看到正在从每个用户的数据库中获取帐户模型!
我希望在Singleton方法中使用类似self.account
的名称来引用原始帐户,但是默认情况下显然不存在该关系,这就是为什么我当前使用self.new.account
的原因。
我还有其他地方可以从a
内部获取保存在self.do_something
中的原始帐户模型吗?我显然可以在参数中传递帐户,但这似乎很乏味,特别是如果以后可以添加参数的话……
答案 0 :(得分:0)
在find_each
循环中,您应该可以使用user.account
。
在该循环之外,我不认为有记录/受支持/不会消失而不会发出警告的查找对象的方法。根据您的Rails版本,类似self.current_scope.proxy_association.owner
的东西可能会为您提供所需的答案...但如果可能的话,请更喜欢user.account
:您使用私有API的次数越多,将来的升级就越困难。
或者,考虑使用association extensions仅在do_something
关联内定义您的has_many
方法-如果不适合被称为User.do_something
或{{1} }(因为它们没有关联的User.where(name: "Bob").do_something
),也许毕竟不应该是顶级方法。