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

キーワードと日付タイプの両方で検索すると、検索が機能しません (すべての投稿リスト項目を取得しています)。どこが間違っているのかわかりません。助けてください。

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 に保存された 2 番目の結果セットは、最初の結果セット (最初の行の @posts に保存されたもの) を上書きします。

「&&」操作を行っているため、最初の行の結果セットを 2 行目に含める必要があります。

問題の解決策の 1 つは、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に対して を実行する必要があります。そうすれば、以前にフィルタリングした結果をフィルタリングできます。.wherePost

お役に立てれば。

于 2013-05-16T10:26:26.583 に答える