【问题标题】:Help optimizing get all children query (ActiveRecord/Ruby/Rails)帮助优化获取所有子查询(ActiveRecord/Ruby/Rails)
【发布时间】:2011-08-31 09:54:18
【问题描述】:

这只是一个关于使用 ruby​​ 和 rails 的 sql 查询性能的快速问题。

基本上我有一个父模型和一堆具有 parent_ID 变量的子模型。 我首先收集所有具有特定条件的父母,然后循环遍历每个父母,找到任何匹配的孩子。

不幸的是,这非常慢,我想知道在优化它方面是否有任何帮助。

 @parents = Parent.where(:parent_id => 3) #This is passed in from params

 @childrenArray =[]
    @parents.each_with_index do |parent, index|
      #TOOSLOW
      @childrenArray[index] = Child.find(:all,:order=>"id",:conditions =>{:parent_ID=> parent.id})
  end

我想的一件事是也许我应该创建一个包含所有要搜索的父 ID 的数组,然后执行类似的操作

child.find_by_parent_ID(myarrayofnumbershere)

但是我不知道这是否会更好。

任何帮助或建议表示赞赏。


我对 SQL 和 ruby​​ 非常陌生。我知道表连接在这里是理想的,但我认为我现在尝试它的开发有点晚了。我还需要提供 2 个单独的数组。一位父母和一位孩子。

【问题讨论】:

  • 您使用的是哪个版本的导轨?

标签: sql ruby-on-rails ruby performance optimization


【解决方案1】:

尝试使用include 方法,如下所示:

@parents = Parent.where(:parent_id => 3).include(:children)

现在 rails 将获取相关联的孩子,您应该能够循环 @parents 并访问他们的孩子而无需额外查询,如下所示:

@parents.each do |p|
  puts "#{p}'s children: #{p.children}"
end

【讨论】:

  • 如果您需要另一个数组,您可以执行类似children = p.collect(&:children) 的操作,还请注意,您需要使用类似has_many :children, :class_name => 'Parent', :foreign_key => 'parent_id'(谷歌自引用has_many)之类的方式定义关系
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多