我的字符串为:“12-22-2015”。它采用MM-DD-YYYY格式。如何检查是否有两个“ - ”以及它是否为MM-DD-YYYY格式。
基本上我需要检查是否存在双重 - 然后使用
Message.includes(:user)
.select('messages.*, users.name')
.where("messages.created_at::date = ?" , Date.strptime(@query, "%m-%d-%Y"))
.paginate(:page => params[:page], :per_page => 5)
查询否则使用
Message.includes(:user)
.select('messages.*, users.name')
.where("users.name ilike ? OR messages.to ilike ?" ,"%#{@query}%", "%#{@query}%")
.paginate(:page => params[:page], :per_page => 5)
我添加了
Message.includes(:user).select('messages.*, users.name')
.where(
"users.name ilike ? OR messages.to ilike ? OR messages.created_at::date = ?",
"%#{@query}%",
"%#{@query}%",
Date.strptime(@query, "%m-%d-%Y")
)
.paginate(:page => params[:page], :per_page => 5)
查询但如果ArgumentError: invalid date
不是日期,则会收到错误@query
。
答案 0 :(得分:2)
没有任何方法可以确定您的字符串是否为MM-DD-YYYY格式。我的意思是,01-02-2016 可能是1月的第二个。但它可能是2月的第一天(对于美国以外的任何地方,可能是)。
您当然可以通过以下方式检查它是否是有效日期:
begin
date = Date.strptime(@query, "%m-%d-%Y")
#code using date goes here
rescue ArgumentError
#code dealing with an invalid date goes here
end
甚至:
date = Date.strptime(@query, "%m-%d-%Y") rescue nil
# date is now nil if @query wasn't a valid date
......这比什么都没有好,但是它没有抓住DD-MM-YYYY和MM-DD-YYYY之间的区别,当然也就是看起来像真正的日期不正确的日期。
答案 1 :(得分:-1)
冒着明显陈述的风险:检查之前的日期,然后将其添加到您的查询中。
class Message < ActiveRecord::Base
DATE_FORMAT = "%m-%d-%Y" # Somewhere at the top of your class
scope :search, lambda do |query|
# Construct the base conditions and variable bindings
conditions = "user.name ILIKE :query_for_like OR messages.to ILIKE :query_for_like"
bindings = { query_for_like: "%#{query}" }
# Try to parse the value as a date; get `nil` otherwise
date_query = Date.strptime(query, DATE_FORMAT) rescue nil
# If it's a valid date, add the date condition and binding to your arguments
if date_query
conditions = "#{conditions} OR messages.created_at::date = :date_query"
bindings[:date_query] = date_query
end
includes(:user)
.select('messages.*, users.name')
.where(conditions, bindings)
end
# ...
end
然后:
@messages = Message.search(@query).paginate(...)