【问题标题】:ActiveRecord Query of associated model Rails 3关联模型 Rails 3 的 ActiveRecord 查询
【发布时间】:2013-03-03 18:44:08
【问题描述】:

我在 rails 中有三个模型,Project(date, has_many :project_savings), Usage(month, amount, has_many :project_savings) 和 MonthlyProjectSaving(amount, belongs_to :usages, :projects)。

它的设置使每个项目都有一定数量的节省,这些节省对应于使用月份的数量。我正在尝试以最安全的方式找到所有具有相应project.date >= usage.monthusage.amount == 0 的项目节省。 usage.monthproject.date 都是日期类型。

以下基本上是我想要得到的,但我尝试了很多方法,但无法正确获取语法。

在我的项目显示视图中:

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

我更喜欢一种不会让 SQL 注入的解决方案。干杯!

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案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;最好在控制器中进行,甚至在模型中进行。

    【讨论】:

    • 完美!这正是我一直在寻找的!哎呀,我有点不清楚,问题中有一个错字(现已修复)。是的,我一直在想办法把它从视图中移到模型中,我想这就是下一个挑战!干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多