2013-04-09 42 views
5

Hi tôi đang sử dụng ransack + kalendae_assets đá quý để tìm kiếm các bản ghi trong giữa ngày bắt đầu và ngày kết thúc cho điều này tôi đang sử dụng các vị từ ransack bằng cách giới thiệu https://github.com/ernie/ransack/blob/master/lib/ransack/constants.rbhồ sơ tìm kiếm giữa ngày bắt đầu và ngày kết thúc để ransack

ở đây là của tôi đang

<%= search_form_for @search, url: guest_search_rooms_path, html: {:method =>:post} do |f| %> 
    <%= f.label :start_date_eq , "Start Date"%> 
    <%= f.text_field :start_date_eq, class: 'release_date' %>  

    <%=f.label :end_date_eq, "End Date" %> 
    <%= f.text_field :end_date_lteq, class: 'release_date' %>  
    <%= f.submit "search" %> 
<% end %> 

rooms.controller

def guest_search 

    @search = Room.search(params[:q]) 
    @roome = @search.result(:distinct => true) 
    @room= @roome.where("status IS ?", true).order("room_type_id desc") 

    #@room = @search.result(:distinct => true) 
end 

nhưng khi tôi đi vào bắt đầu một d ngày kết thúc nó không tìm kiếm như thế nào tôi có thể làm điều này

+1

hiển thị đầu ra của @ room.to_sql – Magnuss

+0

này cho thấy bất cứ điều gì trống không có gì hiển thị mặc dù có rất nhiều hồ sơ có mặt trong phạm vi ngày – r15

+0

@ room.to_sql nên trả lại truy vấn mà activerecord sẽ sử dụng để lấy dữ liệu. Hãy thử 'Room.search (params [: q]). Result.to_sql'. – Magnuss

Trả lời

1

Bạn có thể sử dụng phạm vi với ngày bắt đầu và ngày kết thúc. Sau đó, bạn có thể nhận kết quả tìm kiếm giữa các ngày. Đây là đoạn mã mẫu trong hình thức tìm kiếm của bạn:

<div class="control-group"> 
    <%= f.label :scrap_date_cont, "Scrap Date", class: 'control-label' %> 
    <div class="controls"> 
     <% if q.scrap_date_cont.blank? %> 
    <%= f.text_field :scrap_date_cont, include_blank: true, default: nil, :class => 'datepicker3', :style=>"width:100px;" %> 
     <% elsif !q.scrap_date_cont.blank? %> 
     <%= f.text_field :scrap_date_cont, :value => "#{change_date_format_for_edit_page(q.scrap_date_cont)}", :class => 'datepicker3', :style=>"width:100px;" %> 
     <% end %>&nbsp;<%= link_to "Select Range", "#", :id => 'dates' %> 

    </div> 
    </div> 


    <div class="control-group" id="range" style="display:none" > 
     <%= f.label :scrap_date_gteq, "Range", class: 'control-label' %> 

     <div class="controls"> 
      <% if q.scrap_date_gteq.blank? %> 
      <%= f.text_field :scrap_date_gteq, include_blank: true, default: nil, :class => 'datepicker1', :style=>"width:100px;" %> 
      <% elsif !q.scrap_date_gteq.blank? %> 
      <%= f.text_field :scrap_date_gteq, :value => "#{change_date_format_for_edit_page(q.scrap_date_gteq)}", :class => 'datepicker1', :style=>"width:100px;" %> 
      <% end %> 

      <% if q.scrap_date_lteq.blank? %> 
      <%= f.text_field :scrap_date_lteq, include_blank: true, default: nil, :class => 'datepicker2', :style=>"width:100px;" %> 
      <% elsif !q.scrap_date_lteq.blank? %> 
      <%= f.text_field :scrap_date_lteq, :value => "#{change_date_format_for_edit_page(q.scrap_date_lteq)}", :class => 'datepicker2', :style=>"width:100px;" %> 
      <% end %> 
     </div> 
     </div> 

Và đây là các mã điều khiển:

params[:q][:scrap_date_cont] = change_date_format(params[:q][:scrap_date_cont]) if !(params[:q][:scrap_date_cont]).blank? 
    params[:q][:scrap_date_cont] = params[:q][:scrap_date_cont].to_date.strftime("%d/%Y/%m") if !(params[:q][:scrap_date_cont]).blank? 
    params[:q][:scrap_date_gteq] = change_date_format(params[:q][:scrap_date_gteq]) if !(params[:q][:scrap_date_gteq]).blank? 
    params[:q][:scrap_date_gteq] = params[:q][:scrap_date_gteq].to_date.strftime("%d/%Y/%m") if !(params[:q][:scrap_date_gteq]).blank? 
     params[:q][:scrap_date_lteq] = change_date_format(params[:q][:scrap_date_lteq]) if !(params[:q][:scrap_date_lteq]).blank? 
    params[:q][:scrap_date_lteq] = params[:q][:scrap_date_lteq].to_date.strftime("%d/%Y/%m") if !(params[:q][:scrap_date_lteq]).blank? 

đang Helper:

#Change date format in edit time 
def change_date_format_for_edit_page(date) 
    new_date = date.strftime("%m/%d/%Y") 
    puts new_date.inspect 
    return new_date 
    end 

Script:

$("#dates").click(function() { 
    var $that = $(this); 
    $("#range").toggle("slow", function() { 
    $that.toggleClass("toggled-off"); 
    }); 
}); 

Tôi nghĩ nó có thể giúp bạn ...

4

Với https://github.com/dangrossman/bootstrap-daterangepicker bạn có thể làm tìm kiếm phạm vi ngày với:

= search_form_for q, url: orders_path, builder: SimpleForm::FormBuilder do |f| 
    = f.input :daterange , input_html: {value: "#{q.date_gteq.to_s} - #{q.date_lteq.to_s}"} 
    = f.input :date_gteq, as: :hidden 
    = f.input :date_lteq, as: :hidden 

:coffee 
    $ -> 
    $('#q_daterange').daterangepicker 
     format: "YYYY-MM-DD" 
     startDate: $('#q_date_gteq').val() 
     endDate: $('#q_date_lteq').val() 
     ranges: 
     'This Week': [moment().startOf('week'), moment().endOf('week')], 
     'Next Week': [moment().add('week', 1).startOf('week'), moment().add('week', 1).endOf('week')] 
    , (start, end, label) -> 
     $('#q_date_gteq').val start.format("YYYY-MM-DD") 
     $('#q_date_lteq').val end.format("YYYY-MM-DD") 
    .on 'apply.daterangepicker', -> $('#order_search').submit() 
+0

Cảm ơn bạn đời, đây chỉ là những gì tôi cần. – KaizenCodes

3

Bạn có thể làm cho một vị tùy chỉnh.

Theo quan điểm của tôi, tôi có một trường tìm kiếm ransack như

= f.text_field :request_date_between, class: 'daterange' 

Điều đó sẽ gửi một ngày với bộ điều khiển như

'2015/10/01 đến 2015/10/31'

sau đó trong trình khởi chạy ransack.rb xuống và bẩn của tôi;

Ransack.configure do |config| 
    config.add_predicate 'between', 
         arel_predicate: 'between', 
         formatter: proc { |v| v.split(' to ') }, 
         type: :string 
end 

module Arel 
    module Predications 
    def between other 
     gteq(other[0]).and(lt(other[1])) 
    end 
    end 
end 
Các vấn đề liên quan