Rails - 按datetime_local_field搜索

时间:2015-12-11 19:07:10

标签: mysql ruby-on-rails ruby ruby-on-rails-4

我有一个名为'test'的活动记录。每个测试都有一个StartTime和一个EndTime,它们是MySQL数据库中的日期时间格式。我的视图包含一个包含2个datetime_local_fields的搜索表单:

<%= form_for :test, :url => { :action => :search }, :method => 'get' do %>
  <div class="input-append">
    <%= datetime_local_field :StartDate, params[:search] %><br />
    <%= datetime_local_field :EndDate, params[:search] %><br />
    <button class="btn" type="submit">Search</button>
  </div>
<% end %>

这是来自tests_controller.rb的关联方法:

def search
  if :StartDate
    if :EndDate
      @tests = Test.searchRange(:StartDate, :EndDate).order("StartTime DESC")
    end
  end
end

来自test.rb:

def self.searchRange (date1,date2)
  where(['StartTime >= ? and EndTime <= ?', date1, date2])
end

我每次都会返回0个结果!我无法弄清楚出了什么问题。我的数据库中有一个条目,其中starttime和endtime都在2015-10-22,我使用参数2015-06-01和2015-12-10进行搜索。为什么没有返回匹配的记录?

1 个答案:

答案 0 :(得分:1)

控制器中的

:StartDate不是您所期望的:它只是符号:StartDate。您将需要以下内容:params[:StartDate]来访问从表单发送的参数:

def search
  @tests = Test.scope
  @tests = @tests.from_date(params[:StartDate]) if params[:StartDate]
  @tests = @tests.to_date(params[:EndDate])     if params[:EndDate]
  @tests = @tests.order("StartTime DESC")
end

我会在模型中使用scopes而不是类方法:

scope :from_date, ->(date) { where('StartTime >= ?', date) }
scope :to_date,   ->(date) { where('EndTime <= ?', date) }