2016-01-29 7 views
-1

У меня есть моя строка как «12-22-2015». Его в формате MM-DD-YYYY. Как я могу проверить, имеет ли double «-», а также в формате 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 это не дата.

ответ

2

Невозможно точно сказать, соответствует ли ваша строка в формате MM-DD-YYYY. Я имею в виду, 01-02-2016 может быть вторым января. Но это может быть первое февраля (и, возможно, в любом случае за пределами США).

Конечно, Вы можете проверить, чтобы увидеть, если он является действительным с даты:

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

Как я могу добавить его в мой запрос: @messages = Message.includes (пользователь): ('* сообщений, users.name') .Select где (. "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 

Тогда:

+0

Уважаемый downvoter: Пожалуйста, уделите минутку, чтобы оставить комментарий, объясняющий причину вашего downvote. Если мой ответ не будет, я был бы признателен за его возможность улучшить его. –

Смежные вопросы