私はこのような状況に陥っています。パフォーマンスを向上させる:コレクション内の適切な要素を探すのを避けてください。
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
activity.rb
私は良好な性能を達成し、大きなレポート(SQLクエリの数を持っています固定されていますが)私はもっとうまくいくと思います。私が使用してクエリが
activities = Activity.includes(:client, :cause, :sub_cause, user: :hourly_costs)
であり、これはokです、それは高速ですが、私は理由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レスキュー0' – Ursus
です。私は、hourly_costsを使用せずに正しいhourly_costを指す方法を知りません – Ursus
@Ursus簡単な言葉であなたが望むものを説明してください。私はあなたがそれを得るために質問を作成するのを助けてくれることを嬉しく思っています。ユーザーはターゲットとするトップレベルのテーブルですか?必要に応じて、必要なSqlを投稿することができます。それが有効であれば、Arelはそれを構築することができます – engineersmnky