【问题标题】:How to apply class method scope without a data table column?如何在没有数据表列的情况下应用类方法范围?
【发布时间】:2013-12-31 06:04:23
【问题描述】:

免责声明:第一个问题,rails新手,请在回复中详细说明。

我正在尝试使用基于在我的数据表中的两列上执行的简单方程式的类方法创建过滤器。我不知道如何让查询/过滤器运行,以便它根据我的方程式结果过滤结果。这是我的表格的缩写:

t.integer   “horizontal_length” 
t.integer   “thirty_day_flow_rate”

我想要一个基于以下等式的过滤器:(三十天流量率/水平长度),所以用户可以说,“给我展示所有 30 天流量大于每英尺长度‘x’桶的井”

我在我的模型中创建了一个方法来保存方程,当我在 Well 对象上调用它时它工作正常:

class Well < ActiveRecord::Base

def flow_rate_per_foot
  thirty_day_flow_rate / horizontal_length
end

但是,当我想根据方程式的结果创建过滤器时,我不知道如何进行。我尝试了类似的方法,使用从控制器传入的 mimimum_flow_rate 参数:

class Well < ActiveRecord::Base

def self.flow_rate_filter(minimum_flow_rate)
  if mimimum_flow_rate.present?
    where(‘flow_rate_per_foot >= ?', minimum_flow_rate)
  else
    Well.all
  end
end

显然这不起作用,因为 flow_rate_per_foot 不是我的数据表中要调用的列。我该如何解决这个问题?有没有其他方法可以解决这个问题?我想对许多不同的方程和列进行这种类型的过滤,因此任何解决方案都需要灵活。谢谢!

作为参考,我的控制器如下所示,而我设置的其他直接从我的数据表运行的过滤器可以正常工作:

def index
   @wells = Well.flow_rate_filter(params[:mimimum_flow_rate])
end

谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord rails-activerecord


    【解决方案1】:

    您可以尝试使用范围或像手动查询一样

    @wells = Well.where("(30_day_flow_rate / Horizo​​ntal_length) >= ?", params[:mimimum_flow_rate])

    【讨论】:

    【解决方案2】:

    我最初想做的事情似乎不可能。

    我通过在表中创建一个新字段来保存我最初放置在 flow_rate_per_foot 方法中的“flow_rate_per_foot”计算来解决了这个问题。

    一旦计算结果有了自己的字段,我就可以根据结果进行过滤、搜索和排序,这是我的总体目标。

    【讨论】:

      【解决方案3】:

      在你的模型中添加这一行

      class Well < ActiveRecord::Base
      attr_accessor :minimum_flow_rate
      ...
      

      【讨论】:

        猜你喜欢
        • 2015-12-24
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多