【问题标题】:Ruby on Rails: Select days/months/years ago searchRuby on Rails:选择天/月/年前搜索
【发布时间】:2012-08-03 09:07:04
【问题描述】:

我正在尝试为用户提供按时间范围进行搜索的选项。我想要一个下拉菜单来在这样的下拉菜单中显示选项:

搜索自:3 天前、1 周前、1 个月前、6 个月前、1 年。等等。

我知道我必须使用 DateTime.now.to_date - 3.days,所以 rails 知道我想在 3 天前查询,但我不确定如何让用户看到 3 天前选项作为文本下拉,但查询DateTime.now.to_date - 3.days

谢谢

目前我的搜索视图如下所示:

    <h1>Search</h1>

<% if @project_search.total_entries > 0 %>
<%= form_tag search_path, method: :get do %>

Client :
<%= select(@projects, :client, Project.all.map {|p| [p.client]}.uniq, :prompt => "-Any-", :selected => params[:client]) %></br>

Industry :
<%= select(@projects, :industry, Project.all.map {|p| [p.industry]}.uniq, :prompt => "-Any-", :selected => params[:industry]) %></br>

Role :
<%= select(@projects, :role, Project.all.map {|p| [p.role]}.uniq, :prompt => "-Any-", :selected => params[:role]) %></br>

Technologies :
<%= select(@projects, :tech, Project.all.map {|p| [p.tech]}.uniq, :prompt => "-Any-", :selected => params[:tech]) %></br>

Business Division :

<%= select(@projects, :business_div, Project.all.map {|p| [p.business_div]}.uniq, :prompt => "-Any-", :selected => params[:business_div]) %></br>

Project Owner :
<%= select(@projects, :project_owner, Project.all.map {|p| [p.project_owner]}.uniq, :prompt => "-Any-", :selected => params[:project_owner]) %></br>

Exception PM
<%= select(@projects, :exception_pm, Project.all.map {|p| [p.exception_pm]}.uniq, :prompt => "-Any-", :selected => params[:exception_pm]) %></br>




<%= select_tag "start_date", options_for_select({
      "3 days ago"   => 3.days,   # =    259_200 sec.
      "1 week ago"   => 1.week,   # =    604_800 sec.
      "1 month ago"  => 1.month,  # =  2_592_000 sec.
      "6 months ago" => 6.months, # = 15_552_000 sec.
      "1 year ago"   => 1.year,   # = 31_557_600 sec.
    }) %>


Project Dates between

<%#=  text_field_tag("start_date") %>

and

<%= text_field_tag("end_date") %></br>


Status :

<%= select(@projects, :status, Project.all.map {|p| [p.status]}.uniq, :prompt => "-Any-", :selected => params[:status]) %></br>

Keywords :

<%= text_field_tag :keywords, params[:keywords] %></br>

<%= submit_tag "Search", name: nil %>

<% end %>

我的模特:

class Project < ActiveRecord::Base
  attr_accessible :business_div, :client, :customer_benifits, :edited_date, :end_date, :entry_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech

validates_presence_of :business_div, :client, :customer_benifits, :end_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech


def self.search(search_client, search_industry, search_role, search_tech, search_business_div, search_project_owner, search_exception_pm, search_status, search_start_date, search_end_date, search_keywords) 
  return scoped unless search_client.present? || search_industry.present? || search_role.present? || search_tech.present? || search_business_div.present? || search_project_owner.present? || search_exception_pm.present? || search_status.present? || search_start_date.present? || search_end_date.present? || search_keywords.present?




  where(['client LIKE ? AND industry LIKE ? AND role LIKE ? AND tech LIKE ? AND business_div LIKE ? AND project_owner LIKE ? AND exception_pm LIKE ? AND status LIKE ? AND DATE(start_date) BETWEEN ? AND ? AND DATE(end_date) BETWEEN ? AND ? AND keywords LIKE ?', 
      "%#{search_client}%", "%#{search_industry}%" , "%#{search_role}%" , "%#{search_tech}%" , "%#{search_business_div}%" , 
      "%#{search_project_owner}%" , "%#{search_exception_pm}%" , "%#{search_status}%", 
      search_start_date, search_end_date, search_start_date, search_end_date,"%#{search_keywords}%"
    ])



end


def self.paginated_for_index(projects_per_page, current_page)
    paginate(:per_page => projects_per_page, :page => current_page)
  end

end

【问题讨论】:

标签: ruby-on-rails ruby search date time


【解决方案1】:

您可以以秒为单位指定时间范围:

<%= select_tag "ago", options_for_select({
      "3 days ago"   => 3.days,   # =    259_200 sec.
      "1 week ago"   => 1.week,   # =    604_800 sec.
      "1 month ago"  => 1.month,  # =  2_592_000 sec.
      "6 months ago" => 6.months, # = 15_552_000 sec.
      "1 year ago"   => 1.year,   # = 31_557_600 sec.
    }) %>

并在您的查询中使用该值:

Model.where("created_at >", Time.now - params[:ago])

【讨论】:

  • 感谢您的回复。我已经用我的更多代码编辑了我的问题,所以你可以看到我已经得到了什么。我有一个 start_date 和 end_date 框,用户可以在其中选择确切的日期并在它们之间进行搜索。我想添加执行您建议的选项,但我现在无法将代码插入我的模型。我是一个rails noob,所以还有很多东西要学习。再次感谢
  • 既然您已经有了文本字段,我会使用 date picker 而不是带有固定值的下拉菜单。
  • 我都想要。有时用户只希望显示一系列项目,而选择确切的日期有点麻烦,所以如果你得到我,我想要现成的选项。
  • 如果从下拉列表中选择了一个值,只需设置您的start_date 字段。使用 JavaScript 或在您的控制器中。
【解决方案2】:

使用由 github 家伙编写的 chronic gem 提供支持的自然语言处理。从用户那里获取人类可读格式的范围,然后使用 chronic 将它们解析为 ruby​​ 理解的完全有效日期,并可作为参数传递给 Active Record 以查询数据库

这里有一些例子:

1.9.3p194 :001 > require 'chronic'
 => true 
1.9.3p194 :002 > Chronic.parse '3 days ago'
 => 2012-07-31 15:20:59 +0530 
1.9.3p194 :003 > Chronic.parse '1 week ago'
 => 2012-07-27 15:22:15 +0530 
1.9.3p194 :004 > Chronic.parse '1 month ago'
 => 2012-07-03 15:22:26 +0530 
1.9.3p194 :005 > Chronic.parse '6 months ago'
 => 2012-02-03 15:23:25 +0530 
1.9.3p194 :006 > Chronic.parse '1 year ago'
 => 2011-08-03 15:23:34 +0530

现在,您在这里也有点疯狂,还可以做一些类似的事情

1.9.3p194 :007 > Chronic.parse 'last night'
 => 2012-08-02 22:00:00 +0530 

README 中提供了更多示例,但由于它非常灵活,我想说您还可以在接受用户输入的同时获得创意。因此,您可以允许用户选择任意日期,而不是选择框中的预定值(您仍然可以这样做)。我知道这不是传统的方式,但我认为使用 NLP 非常酷!所以try it

【讨论】:

  • 感谢您提供的所有信息!我认为我的主要问题仍然是试图了解视图、控制器和模型如何协同工作。还没有完全掌握。我会研究这个慢性宝石。再次感谢
猜你喜欢
  • 2011-05-25
  • 2012-07-21
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
相关资源
最近更新 更多