我有这种情况。提高性能:避免在集合中寻找正确的元素
activity.rb
belongs_to :user
belongs_to :cause
belongs_to :sub_cause
belongs_to :client
def amount
duration/60.0 * user.hourly_cost_by_year(date.year).amount rescue 0
end
user.rb
has_many :hourly_costs # one hourly_cost for year
has_many :activities
def hourly_cost_by_year(year = Date.today.year)
hourly_costs.find { |hc| hc.year == year }
end
hourly_cost.rb
belongs_to :user
我有一个很大的报告,我取得了良好的性能(SQL查询的数量是固定的),但我认为我可以做得更好。我使用的查询是
activities = Activity.includes(:client, :cause, :sub_cause, user: :hourly_costs)
这是确定的,这是快,但我认为这是改善的,因为hourly_cost_by_year
方法。我的意思是,活动有一个日期,我可以使用该日期来了解我应该使用哪些小时成本。像这样的事情在activity
def self.user_with_single_hourly_cost
joins('LEFT JOIN users u ON u.id = activities.user_id').
joins('LEFT JOIN hourly_costs hc ON hc.user_id = u.id AND hc.year = EXTRACT(year from activities.date)')
end
但在我的询问,我不如何集成这一点。无论我尝试过什么都行不通。我可以使用原始SQL,但我试图使用ActiveRecord。我甚至认为使用redis缓存每用户和每年的每小时成本,可以工作,但我认为这个查询,与提取部分,应该做最好的工作,因为我有一个平坦的表。
更新:我试图澄清。无论查询我在行动,在某些时候使用我所要做的
activities.sum(&:amount)
和方法,你知道,是
def amount
duration/60.0 * user.hourly_cost_by_year(date.year).amount rescue 0
end
而且我不知道如何挑选直接我想hourly_cost无需在hourly_costs之间搜索。这可能吗?
男人,查询工作,但它也是我的工作。问题是呼叫'hourly_cost_by_year'在这一行'duration/60.0 * user.hourly_cost_by_year(date.year).amount rescue 0' – Ursus
我的意思是,我不知道如何指向正确的hourly_cost而不使用hourly_costs查找 – Ursus
@Ursus用最简单的术语解释你想要的结果,我很乐意帮你建立一个查询来获得它。用户是您想要定位的顶级表格吗?如果需要,您可以发布所需的Sql。如果它是有效的Arel可以构建它 – engineersmnky