【发布时间】:2017-06-15 15:33:38
【问题描述】:
我有这种情况。
活动.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
用户.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 之间进行搜索。这可能吗?
【问题讨论】:
标签: ruby-on-rails ruby