有什么方法可以访问被称为单例方法的Parent对象?

时间:2018-06-20 19:43:19

标签: ruby-on-rails ruby activerecord rails-activerecord singleton-methods

鉴于以下功能片段,我在减少数据库查询方面遇到了麻烦:

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中的原始帐户模型吗?我显然可以在参数中传递帐户,但这似乎很乏味,特别是如果以后可以添加参数的话……

1 个答案:

答案 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),也许毕竟不应该是顶级方法。