【问题标题】:Rails 3, Model Methods / Calculated AttributesRails 3,模型方法/计算属性
【发布时间】:2012-03-05 18:01:11
【问题描述】:

我正在处理大量计算以将模型中的各种值变为简单的 TRUE 或 FALSE。问题是,这些计算非常激烈,我不想为此创建一个长而难以遵循的 SQL 语句。我宁愿将整个计算放在模型在返回记录时可以检查的方法中。

我已经尝试了多种方法来实现这一点,并且在查找其他类似的壮举时,其他人将像我这样的新手推向 SQL,这可能服务于大多数目的,但不会为我服务,因为正在进行的计算在某种程度上是模型外部的。

型号:

class Quality < ActiveRecord::Base
...
def passed_inspection
   [code that calculates based on values in model]
end

控制器:

@records = Quality.where('passed_inspection = true')

查看:

Did pass inspection?: <%= record.passed_inspection %>

【问题讨论】:

  • 你能发布一个你正在尝试的计算的例子吗?
  • 您需要帮助解决什么问题?如果您不想使用长 SQL 语句,请使用代码模型的方法。如果您不想将计算代码放在模型的类中,请创建控制器辅助方法,该方法将模型作为输入并返回 TRUE 或 FALSE。
  • @MatteoMelani 我已经将计算表示为视图助手,但我还需要根据通过/失败提取记录。例如,我有一个视图,它只将失败的记录输出到表中。
  • @ScottJShea,我不能真正发布太多内容,因为它包含我客户的一些特权公式等。计算本身并不是压倒性的或困难的。它们是一系列转录到 Ruby 中的 Excel 评估。我只是看不出如何将它们变成易于阅读的 SQL 语句。我宁愿为自己简化,但为以后可能参与的其他人简化。
  • @Nicodemus 我跟着你...看起来 coderates 无论如何都有帮助

标签: ruby-on-rails-3 activerecord


【解决方案1】:

听起来您的问题的解决方案是使用 ScopeClass Method 来帮助清理您的模型。基本上你会像这样设置你的模型:

class Quality < ActiveRecord::Base
    def self.passed_inspection
        # Code that does your calculations
    end

    scope :passed, passed_inspection() # This needs to be below the function above
end

然后你可以通过这样调用它来获取这些数据

@records = Quality.passed

如果您需要更多信息,请参阅有关此问题的 Rails:RailsCast #215 Advanced Queries

编辑:修正了一些糟糕的语法

【讨论】:

  • 如果我还能投票给你,我会的!非常感谢。这基本上就是我所需要的。
猜你喜欢
  • 2014-07-05
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2014-01-07
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
相关资源
最近更新 更多