有没有办法访问调用单例方法的父对象?



鉴于以下功能片段,我在减少数据库查询时遇到问题:

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_somethingUser.where(name: "Bob").do_something(因为它们没有关联的account(,也许它根本不应该是顶级方法。

相关内容

  • 没有找到相关文章

最新更新