Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道4+;,按子项列出的父记录排序列表_Ruby On Rails_Activerecord_Query Optimization - Fatal编程技术网

Ruby on rails 轨道4+;,按子项列出的父记录排序列表

Ruby on rails 轨道4+;,按子项列出的父记录排序列表,ruby-on-rails,activerecord,query-optimization,Ruby On Rails,Activerecord,Query Optimization,我有一个显示大量数据的页面,我正在对其进行优化,我正在努力平衡减少DB查询与按需要的顺序获取适当数据之间的关系 事务是顶级元素,每个事务都有多个工作流,每个工作流都有许多里程碑。我按位置:整数属性对工作流和里程碑进行排序 # Top-level element class Transaction < ApplicationRecord has_many :workflows has_many :team_members end # Parent element for miles

我有一个显示大量数据的页面,我正在对其进行优化,我正在努力平衡减少DB查询与按需要的顺序获取适当数据之间的关系

事务
是顶级元素,每个
事务
都有多个
工作流
,每个
工作流
都有许多
里程碑
。我按
位置:整数属性对
工作流
里程碑
进行排序

# Top-level element
class Transaction < ApplicationRecord
  has_many :workflows
  has_many :team_members
end

# Parent element for milestones
class Workflow < ApplicationRecord
  belongs_to :transaction
  has_many :milestones
end

# Unique individual
class Person < ApplicationRecord
  has_many :team_members
end

# Acts as a join between Transactions and Persons
class TeamMember < ApplicationRecord
  belongs_to :transaction
  belongs_to :person
  belongs_to :team_member_type
end

class TeamMemberType < ApplicationRecord
  has_many :team_members
end
这将在1db查询中收集我需要的所有数据,但问题是当我迭代工作流的里程碑时,我需要按
位置
属性对其进行排序

# Top-level element
class Transaction < ApplicationRecord
  has_many :workflows
  has_many :team_members
end

# Parent element for milestones
class Workflow < ApplicationRecord
  belongs_to :transaction
  has_many :milestones
end

# Unique individual
class Person < ApplicationRecord
  has_many :team_members
end

# Acts as a join between Transactions and Persons
class TeamMember < ApplicationRecord
  belongs_to :transaction
  belongs_to :person
  belongs_to :team_member_type
end

class TeamMemberType < ApplicationRecord
  has_many :team_members
end
我可以从数据库中获取数据,然后用Ruby对其进行排序,但这似乎效率不高,我更愿意在数据库中正确地完成这一切(如果可能的话)

如果我用一个
N+1
问题来写它,它会是这样的:

<% @workflows.order(:position).each do |workflow| %>
  <%= workflow.name %>
  <% workflow.milestones.order(:position).each do |milestone| %>
    <%= milestone.name %>
  <% end %>
<% end %>

我的主要目标是提高效率。如果我需要使用一些查询对象来清理它和原始SQL,我可以接受,我只是不是非常精通SQL,如果合理的话,我更喜欢使用ActiveRecord。

您可以在controller方法中按这两个属性排序:

def show
  @transaction = Transaction.includes(
    team_members: [:person, :team_member_type],
    workflows: [:milestones]
  ).order('milestones.position, team_member_types.value').find(params[id])
end

如果这有帮助,请告诉我。

您可以创建包含order__by的关联,但我的经验是,在急切加载时,该关联可能会自动失败,导致结果无序

虽然您可能正确地认为在Ruby中进行排序效率较低,但我至少会对其进行基准测试。主要的性能问题是在n+1查询的情况下,我很乐观,您会发现Ruby中的排序性能足够好

def show
  @transaction = Transaction.includes(
    team_members: [:person, :team_member_type],
    workflows: [:milestones]
  ).order('milestones.position, team_member_types.value').find(params[id])
end