我有一个显示大量数据的页面,我正在优化它,并且我努力通过在订单中获取正确的数据来平衡减少的DB查询我需要。Rails 4+,儿童父记录的订购清单
甲Transaction
是顶级元素,并且每个transaction
具有多个workflows
并且每个workflow
有许多milestones
。我通过position:integer
属性订购workflows
和milestones
。
# 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
在我的控制器,这是我有:
def show
@transaction = Transaction.includes(
team_members: [:person, :team_member_type],
workflows: [:milestones]
).find(params[id])
end
此收集所有我需要在1所DB查询的数据,但问题是,当我遍历里程碑的工作流程,我需要按position
属性对其进行排序。
我可以从数据库中获取数据,然后使用Ruby对其进行排序,但这似乎效率低下,我宁愿在数据库中正确完成所有操作(如果可能)。
如果我将其与N+1
问题写的,它应该是这样的:
<% @workflows.order(:position).each do |workflow| %>
<%= workflow.name %>
<% workflow.milestones.order(:position).each do |milestone| %>
<%= milestone.name %>
<% end %>
<% end %>
我认为每个人都同意这是一个坏主意,但我在努力弄清楚如何对数据进行排序并同时优化我的数据库调用。
我也用team_member_type.value
属性对team_members
进行排序,但这与上面的问题相同。
<% @team_members.includes(:team_member_type, :person).order("team_member_types.value").each do |team_member| %>
...
<% end %>
我的主要目标是效率。如果我需要使用一些查询对象来清理它和原始SQL,那我可以,我只是不太熟练SQL,并且如果合理的话,更喜欢使用ActiveRecord。