我正在为帖子搜索创建表单。我这样做....
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 :(得分:0)
我不确定您是否故意这样做,但是在您控制器的elseif
和else
部分中,您将覆盖搜索结果。
例如,在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中的内容)。
因为你正在做“&amp;&amp;”然后,您应该将第一行的结果集包含在第二行中。
您的问题的一个解决方案可能是将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
模型上执行{{1}}。这样您就可以过滤先前过滤的结果。
希望这有帮助。