2013-05-16 123 views
0

我正在爲我的帖子搜索創建一個表單。我做這樣的....搜索功能在紅寶石軌道上不工作

ERB形式碼...

<%= form_tag '/posts/search-post', :remote=> "true" do %> 
<p> 
    <%= text_field_tag :search, params[:search], :placeholder => "Search Posts..." %><br/> 
    <%= radio_button_tag :day, 1, params[:day] %>None 
    <%= radio_button_tag :day, 2, params[:day] %>Last Week 
    <%= radio_button_tag :day, 3, params[:day] %>Last Month<br/> 
    <%= submit_tag "Search", :onclick => "document.getElementById('spinner').style.visibility='visible';document.getElementById('postlist').style.visibility='hidden'" %> 
</p> 
<% end %> 

root.rb

match 'posts/search-post', to: 'posts#search_post' 

posts_controller.rb

def search_post 
    if !params[:search].blank? && params[:day].blank? 
    @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]) 
    elsif params[:search].blank? && !params[:day].blank? 
    @posts = Post.paginate(page: params[:page],:per_page => 5).all if params[:day] == "1" 
    @posts = Post.paginate(page: params[:page],:per_page => 5).where("created_at >= ?", 1.week.ago.utc) if params[:day] == "2" 
    @posts = Post.paginate(page: params[:page],:per_page => 5).where("created_at >= ?", 1.month.ago.utc) if params[:day] == "3" 
    elsif !params[:search].blank? && !params[:day].blank? 
    @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]) if params[:day] == "1" 
    @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]).where("created_at >= ?", 1.week.ago.utc) if params[:day] == "2" 
    @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]).where("created_at >= ?", 1.month.ago.utc) if params[:day] == "3"  
    else 
    end 
    end 

Post.rb模型

def self.search(search) 
    search_condition = "%" + search + "%" 
    if search 
     find(:all, :conditions => ['lower(content) LIKE ? OR lower(title) LIKE ?', search_condition.downcase,search_condition.downcase]) 
    else 
     find(:all) 
    end 
    end 

搜索post.js.erb

$("#posts_list").html("<%= escape_javascript(render(:partial => "posts")) %>"); 

當我通過關鍵字和天類型,然後搜索不工作(讓所有文章列表項)進行搜索。我不知道我錯在哪裏。請幫忙。

+0

究竟哪些方法無效? – okodo

+0

當兩個字段(搜索和日期字段)不爲空時,搜索不起作用('AND'操作不起作用)。 –

+0

「搜索無法正常工作」 - 意味着您收到錯誤或者錯誤或沒有數據? – 2013-05-16 10:19:26

回答

0

我不確定您是否有意這樣做,但是在您的控制器的elseifelse部分中,您都覆蓋了搜索結果。

例如,在你的else節,你首先做到這一點:

@posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]) if params[:day] == "1" 

,然後你這樣做:

@posts = Post.paginate(page: params[:page],:per_page => 5).where("created_at >= ?", 1.week.ago.utc) if params[:day] == "2" 

這意味着,第二組結果被保存在@帖子會覆蓋你的第一組結果(保存在第一行的@posts中)。

由於您正在執行「& &」操作,因此您應該將第一行的結果集包含在第二行中。

一個解決方案,您的問題可能是你的Post.rb模式更改爲類似這樣:

def self.search(search, previous_results_set) 
    search_condition = "%" + search + "%" 
    if search 
     if previous_result_set.nil? 
     find(:all, :conditions => ['lower(content) LIKE ? OR lower(title) LIKE ?', search_condition.downcase,search_condition.downcase]) 
     else 
     previous_result_set.find(:all, :conditions => ['lower(content) LIKE ? OR lower(title) LIKE ?', search_condition.downcase,search_condition.downcase]) 
    else 
     find(:all) 
    end 
    end 

我的代碼可能不會是完美的,你也許可以找到這樣做的更有效的方法你代碼,但你明白了。即使用戶使用.where,也需要對前一個結果集執行.where,而不是整個Post模型。這樣你將過濾你以前的過濾結果。

希望這會有所幫助。