如何将自定义范围中的两个变量与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)}
答案 0 :(得分:2)
你采取错误的方法试图操纵模型。您正在运行查询以返回模型,您还没有任何模型可以操作。
您可以使用SQL完成您在数据库级别上尝试执行的操作。我会写这样的范围
如果离开变量是一个字符串,表示格式为“yyyy-mm-dd”的日期。你可以做到
scope :departure, -> (departure) { where("date(departure) = ?", departure )}
这假设您正在使用postgres,它可能与mysql略有不同。 date()函数将数据库elevel上的日期时间转换为日期