对象实例的未定义​​方法`includes'

时间:2015-06-05 19:50:45

标签: ruby-on-rails ruby performance ruby-on-rails-4 activerecord

我正在使用Ruby 2.2.1和Rails 4.2来构建应用程序。在我的一个观点中,我收到以下消息:

  

检测到N + 1个查询     政治家=> [:帐户]     添加到您的finder :: includes => [:帐户]

     

N + 1查询方法调用堆栈

     

app / models / user.rb:19:在`account'

     

app / controllers / home_controller.rb:6:在`index'

这是我在家庭控制器的行动:

@account = current_user.account
@new_contacts = current_user.contacts.created_this_week.count
@new_collabs = current_user.collaborators.created_this_week.count

用户模型的相关部分:

belongs_to :role, polymorphic: true, dependent: :destroy
delegate :account, to: :role
delegate :collaborators, to: :role
delegate :contacts, to: :role

我已经尝试了以下内容:

@account = current_user.account.includes(:contacts, :collaborators)

但我只收到错误:

undefined method `includes' for <Account:0x007fa7474e04a8>

我做了一些研究,看起来似乎只包括关系的作品(事实并非如此)。

子弹无所畏惧吗?我该怎么做才能停止成为N + 1查询?

谢谢!

1 个答案:

答案 0 :(得分:7)

includes只能在ActiveRecord::RelationActiveRecord::Base子类上调用,account似乎是模型的实例,因此无法响应{{1}像ActiveRecord::Relation这样的方法。一旦您从includes获得帐户,bullet就会出现误报,虽然我不建议对关联进行爆炸,但这可能导致该功能出现N + 1问题。

用AR协会代替delagate:

假设current_user是常规Account模型,您可以使用ActiveRecord宏(有关详情,请查看documentation):

has_one

当你需要遍历用户时,它非常少:

has_one :account, through: :role