【问题标题】:has_many association sate check executing N+1 queries active adminhas_many 关联状态检查执行 N+1 查询活动管理员
【发布时间】:2019-02-10 05:32:01
【问题描述】:

模型结构:用户有很多订阅和博客,订阅有_many优惠券。 我已经包含了 has_many 表,但我需要为每个订阅执行状态检查 因此,如果我在作用域集合中执行 where 查询,那么它会让所有用户都只有有效的订阅。那么如何避免 N+1 查询并同时进行状态检查。

def scoped_collection
  end_of_association_chain.includes(:subscriptions, :blogs)
end
index do  
  column :email
  column "referrer" do |user|
    subscription = user.subscriptions.valid.first
    subscription.referrers.first.code if subscription
  end
  column "blog_id" do |user|
     user.blog.id if user.blog
  end

end

【问题讨论】:

  • subscription.valid 是什么?
  • Subscription.where(:state => 1)
  • 请检查我的答案,如果它不起作用,请告诉我
  • @Vishal 它不起作用,我在评论中提到的原因请检查

标签: ruby-on-rails activeadmin


【解决方案1】:

仅从查询中加载有效订阅,请检查以下代码

 controller do
      def scoped_collection
        User.includes(subscriptions: :referrers).select("users.*, (SELECT referrers.code from referrers WHERE subscriptions.state = 1 LIMIT 1) as refer_code")
      end
  end

【讨论】:

  • 我不能只将它用于推荐人代码,因为我有更多的列,所以我只需要有效的订阅。我也修改为 select("users.*, (SELECT * from subscriptions WHERE subscriptions.state = 1)") 但它不起作用..请帮帮我
  • @SumitSharma 是的,它只会获取有效订阅,你能告诉我你遇到了什么错误吗?
  • 这里是错误 Mysql2::Error: Operand should contain 1 column(s): SELECT COUNT(count_column) FROM (SELECT users.*, (SELECT * from subscriptions WHERE subscriptions.state = 1) AS count_column FROM users WHERE users.origin = 20 LIMIT 30 OFFSET 0) subquery_for_count
  • 仅尝试我的查询,为什么您使用 LIMIT 30 OFFSET 0,只使用 LIMIT 1,这是子查询,它不适用于整个记录。更改为 LIMIT 1 并检查记录
  • @SumitSharma 使用 gem 'pry' 进行调试,并在查询后添加binding.pry @users.map(&:attributes) 将为您提供所有属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2015-03-25
相关资源
最近更新 更多