0

Railsには、Project(date、has_many:project_ Savings)、Usage(month、amount、has_many:project_ Savings)、MonthlyProjectSaving(amount、belongs_to:usages、:projects)の3つのモデルがあります。

各プロジェクトには、使用月数に対応する節約額があるように設定されています。私は、対応するproject.date>=usage.monthを持ち、usage.amount == 0可能な限り最も安全な方法で、すべてのプロジェクトの節約を見つけようとしています。usage.monthでありproject.date、両方とも日付型です。

以下は基本的に私が取得しようとしているものですが、いくつかの方法を試しましたが、正しい構文を取得できません。

私のプロジェクトのショービューでは:

s = @project.monthly_project_savings
s.where(s.usage.month >= @project.date).where(s.amount: 0)

SQL インジェクションにさらされないソリューションを希望します。乾杯!

4

1 に答える 1

1

このようなものを探しているのではないかと思いますがmonthly_project_savings、Usage#month と Project#date が何であるか、またはどのタイプであるかはわかりません。

s.joins(:usages).where('usages.month >= ?', @project.date).where(amount: 0)

.where引数は自動的に適切に引用されるため、文字列でプレースホルダーを使用してもまったく問題ありません。これは、避けるべき信頼されていないパラメーターを使用した直接的な SQL 変更または補間です。詳細: http://guides.rubyonrails.org/security.html#sql-injection

余談ですが、ビューでクエリを実行することはあまり MVC ではありません。コントローラーで行うか、モデルで行う方がよいでしょう。

于 2013-03-03T21:19:41.240 に答える