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 %>

根.rb

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

post_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") ) %>");

当我同时按关键字和日期类型搜索时,搜索不起作用(获取所有帖子列表项)。我不知道我错在哪里。请帮忙。

4

1 回答 1

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 中的第二组结果将覆盖您的第一组结果(保存在第一行的@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再次对整个模型执行。这样,您将过滤以前过滤的结果。

希望这可以帮助。

于 2013-05-16T10:26:26.583 回答