Rails根据条件找到

时间:2012-12-10 05:16:51

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

只是想知道是否有任何功能允许这样做:

MyModel.find_by_conditon(method_a - method_b > 0)

MyModel.class

def method_a
  next_service_date.to_i
end

def method_b
  last_service_date.to_i
end
def next_service_date
  service_date.present? ? calculated_time_estimation : row_time_estimation
end
def calculated_time_estimation
  service_date + calculated_service_period
end
def calculated_service_period
      case(service_frequency_period)
      when 'Year'
        service_frequency_number.to_i.year
      when 'Month'
        service_frequency_number.to_i.month
      when 'Week'
        service_frequency_number.to_i.day * 7
      when 'Day'
        service_frequency_number.to_i.day
      end
end

service_frequency_numberservice_frequency_periodservice_date是MyModel的属性

2 个答案:

答案 0 :(得分:1)

假设method_amethod_b实际上是属性,您可以这样做:

MyModel.where('method_a - method_b > ?', 0)

修改

我认为你能够在计算字段上查询的唯一方法是将计算移动到DB,在那里你将有一个标量函数来返回结果。然后你可以做MyModel.where('next_service_date_on_db(service_date) > 0')。不幸的是,这会将您绑定到特定于数据库的实现,但如果没有服务器端功能,您将无法以这种方式进行查询。

现在,如果您拥有整个集合,则可以根据这些条件进行过滤,但您必须加载整个集合。例如:

MyModel.all.select {|m| m.method_a - m.method_b > 0}

#all返回所有对象的数组,并根据块的条件选择过滤器。不幸的是,此解决方案会加载所有记录以对应用程序进行排序。

答案 1 :(得分:0)

不完全确定您要实现的目标......但您可能不得不求助于SQL?

(什么是method_a和b?)

MyModel.where('? > 0', (method_a - method_b))