我有這種情況。提高性能:避免在集合中尋找正確的元素
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