Ruby on rails 轨道4+;,按子项列出的父记录排序列表
我有一个显示大量数据的页面,我正在对其进行优化,我正在努力平衡减少DB查询与按需要的顺序获取适当数据之间的关系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
事务
是顶级元素,每个事务
都有多个工作流
,每个工作流
都有许多里程碑
。我按位置:整数属性对工作流
和里程碑
进行排序
# 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