2016-01-29 59 views
-1

我有我的字符串:「12-22-2015」。它採用MM-DD-YYYY格式。我如何檢查是否有雙「 - 」,如果它是MM-DD-YYYY格式。在ruby中查看日期格式

基本上,我需要檢查,如果雙 - 存在,則使用

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) 

查詢,但如果@query遇到錯誤ArgumentError: invalid date不是日期。

回答

2

沒有任何方法可以確定您的字符串是否處於MM-DD-YYYY格式。我的意思是,01-02-2016 可能是是1月份的第二次​​。但它可能是二月的第一個(也可能是美國以外的任何地方)。

當然你也可以檢查,看它是否是一個有效的日期:

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之間的區別,或者看起來像是一個真實的日期。

+0

如何我可以在查詢中添加它( '郵件*,users.name')。選擇在哪裏(。 「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) – Neha

-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.includes(:用戶)

+0

親愛的downvoter:請花點時間留下評論,解釋您的downvote的原因。如果我的答案缺乏,我希望有機會改進它。 –