Rails 4 - 比较范围内的两个变量

时间:2014-07-02 14:05:15

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

如何将自定义范围中的两个变量与Rails 4进行比较?

文档和常见示例始终显示与表属性的基本比较

就像这个例子一样:

class Post < ActiveRecord::Base
  scope :created_before, ->(time) { where("created_at < ?", time) }
end

但就我而言,我想将模型中的日期时间与来自表单提交的日期字符串进行比较

scope :departure, -> (departure) { where("departure = ?", "%#{departure}%")}

问题是我想在比较之前对我的模型变量进行一些操作(例如,转换为字符串或更改格式)

我试过不同的方法,比如这个

def self.departure(departure)
  @date_without_time = flights.departure.to_date.to_s
  where(@date_without_time, "= ?", departure)
end

但条件最终会像这样(2012-01-03)而不是(departure =“%#{departure}%”)

有更好的方法吗? 更一般地说,如何创建比较两个变量的方法或范围,而不是仅仅将一个变量与模型属性进行比较?

在这种情况下,我想比较我的模型属性,即Datetime和表单提交的字符串日期,所以在我比较两个日期之前我需要对我的模型属性做一些处理,因为我需要忽略时间部分并将其格式化为字符串

更新:

我最终使用此方法使其工作,但我仍然想知道是否可以在作用域中的Model列上调用类或实例方法,或者是否有更好的方法来处理Datetime /表单日期比较以更好的方式

scope :departure_s, -> (departure) { where("departure > ?", departure.to_datetime.beginning_of_day)}
scope :departure_e, -> (departure) { where("departure < ?", departure.to_datetime.end_of_day)}
scope :departure, -> (departure) {  departure_e(departure).departure_s(departure)}

1 个答案:

答案 0 :(得分:2)

你采取错误的方法试图操纵模型。您正在运行查询以返回模型,您还没有任何模型可以操作。

您可以使用SQL完成您在数据库级别上尝试执行的操作。我会写这样的范围

如果离开变量是一个字符串,表示格式为“yyyy-mm-dd”的日期。你可以做到

scope :departure, -> (departure) { where("date(departure) = ?", departure )} 

这假设您正在使用postgres,它可能与mysql略有不同。 date()函数将数据库elevel上的日期时间转换为日期