ruby-on-rails - rails : combining optional params into a query

标签 ruby-on-rails ruby-on-rails-3

我有一个 View ,其中包含需要过滤的巨大分页记录列表。

用户可以通过几种不同的方式按记录进行过滤(例如“已保存”记录、“读取”记录和“标记已删除”记录),我希望他们能够合并 这些过滤器以任何可能的方式。

我目前的、有缺陷的、不起作用的方法。除非所有参数均已指定且有效,否则下面的代码不会产生任何结果:

#view. Set the 'se' filter to true; leave all others as is 
<%= link_to list_url(:id=>params[:id], :se=>"true", :st=>params[:st], :re=>params[:re]) do %> 
  <div class="button">Toggle SE</div>
<% end %>

#controller query. Add whichever params are passed into the conditions for the new page.
#query is paginated and sorted
@records = Record.where("user_id IN (?) AND see = ? AND star = ? AND delete = ? AND like = ?", @users.select("id"), params[:se], params[:st], params[:re]).paginate :page => params[:page], :order => (sort_column + " " + sort_direction)

创建此过滤系统的最佳方法是什么?
我想客户端排序比每次都要求服务器参与要快 - 有没有一种简单的 AJAX 方法来完成这种事情?想象一下,用户可以以任意组合打开和关闭过滤器。

最佳答案

试试这个:

conditions = {:user_id => @users.select("id")}
{
 :se => :see,
 :st => :star,
 :del => :delete
}.each{|k1, k2| conditions[k2] = params[k1] unless params[k1].blank?}

@records = Record.where(conditions).paginate(...)

conditions 哈希将根据 params 哈希中存在的值进行填充。

编辑 1

您可以组合条件哈希和数组。

@records = Record.where(conditions).where(
  ":created_at > ?",  Date.today - 30).paginate(...)

您可以通过指定将 user_id 条件更改为您想要的内容

conditions[:user_id] = @user.id

在上面的语句中,如果 RHS 是一个数组,rails 会自动生成 IN 子句。否则,执行相等检查(=)。

关于ruby-on-rails - rails : combining optional params into a query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4112118/

相关文章:

ruby-on-rails - solr,太阳黑子,错误请求,非法字符

ruby-on-rails - 带命名空间的 Rails 3 路由

ruby-on-rails - Heroku 使用生产配置而不是暂存配置

ruby-on-rails-3 - Rails - 更改了表名,现在测试不会运行

ruby-on-rails - <%= h…%>在Rails中是什么意思?

ruby-on-rails - 在 Rails 中提交嵌套表单时出现 500 Internal Server Error

ruby-on-rails - 使用 LDAP 进行 Rails 身份验证

ruby-on-rails - 一个 Rails 应用程序,两个域,每个域不同的 session

ruby-on-rails-3 - rails3-jquery-自动完成

ruby-on-rails - 为什么当我尝试将对象保存到数据库时 Rails 函数测试失败