Ruby on rails 3 如何在视图中添加列过滤器选项(以“rails方式”进行)

Ruby on rails 3 如何在视图中添加列过滤器选项(以“rails方式”进行),ruby-on-rails-3,Ruby On Rails 3,我为一个相当简单的问题寻找有效的解决方案,但找不到好的解释 我目前正在使用的是一个索引视图,其中包含: 用于输入新元素和 使用will_paginate对现有元素进行分页的列表。 对于列表,我只对部分数据感兴趣,因此我尝试添加一个带有筛选选项的表单,我希望将表单内容存储在cookie中,该cookie应替换为数据库中存储的每个用户对象,但我还没有用户。我不知道的是如何从存储在cookie中的表单获取值,反之亦然,以及如何将其与will_paginated一起使用 我当前尝试做的第一步是在我的控制

我为一个相当简单的问题寻找有效的解决方案,但找不到好的解释

我目前正在使用的是一个索引视图,其中包含:

用于输入新元素和 使用will_paginate对现有元素进行分页的列表。 对于列表,我只对部分数据感兴趣,因此我尝试添加一个带有筛选选项的表单,我希望将表单内容存储在cookie中,该cookie应替换为数据库中存储的每个用户对象,但我还没有用户。我不知道的是如何从存储在cookie中的表单获取值,反之亦然,以及如何将其与will_paginated一起使用

我当前尝试做的第一步是在我的控制器中创建一个@filter对象,并为该对象添加过滤器表单,设置表单选项以再次使用索引控制器。这将导致选定的过滤器参数在params散列中传递给url中可见的索引控制器。但这种解决方案有一些缺点。首先,当我更改视图(例如通过创建新元素)时,过滤器就消失了,其次,@filter对象应该是cookie

以下是我目前掌握的代码:

部分过滤器的视图:

<%= form_for(@filter, :url => {:action => "index"}, :html => {:method => :get}) do |f| %>
  <div class="field">
    <%= f.label :german %><br />
    <%= f.check_box :german %>
  </div>
  <div class="actions">
    <%= f.submit "Filter" %>
  </div>
<% end %>

有人能帮我吗?在其他应用程序中过滤结果的功能是如何实现的?

因此,问题的答案是,使用where子句仅在结果中包含匹配的记录

@words = Word
  .where("german = ?", params[:word][:german] != 0")
  .order('word')
  .paginate(:page => params[:page])
这是一种新的Rails语法,简称activerelationarel,通常应该用方法替换旧的find和find_。它有几个可以提高性能的好处,特别是它执行的SQL只有在引用时才会出现,而不是在声明时才会出现,您可以在日志中看到这些SQL。这为您提供了定义局部关系的简洁方法,甚至可以将其定义为命名范围,您可以构建这些命名范围来创建组合在一起的更简单语句

不同子句的顺序无关紧要-AREL将生成相同的SQL,但通常我喜欢遵循底层SQL的顺序

哪里 加入 组 顺序 限度 抵消
在您的案例中,限制和偏移量由分页工具处理。

通过过滤器,您的意思是希望从数据库中获得部分但不是全部记录吗?起初,我以为你的意思是你只想要一些专栏。如果是第一个,那么您希望使用where子句-例如Word.wherelanguage=?,params[:language]。是的,我希望筛选记录。您的提示起到了一定的作用,我现在有以下行用于复选框:@words=Word.paginate:page=>params[:page]。订购'Word'。wheregerman=?,params[:Word][:german]!=0声明的顺序是否重要,例如关于性能?据我所知,情况并非如此。根据下面的答案,我的控制器变成:session[:word]=params[:word]if params[:word]@filter=Word.newsession[:Word]和@words=Word.wherederman=?,会话[:Word][:derman]!=0.对“单词”进行排序。分页:page=>params[:page]。我没有使用cookie,而是使用会话在cookie中存储散列,结果显示错误消息。但这是一个很好的起点…我仍然怀念的是一个更具交互性且不污染url的解决方案。我想那时我必须使用AJAX,对吗?。用于筛选表单的对象不应为Word类,因为布尔值的筛选选项有三种状态:未选中、true和false。在这里,我可能不得不使用一些javascript或css解决方案,也许你可能想作为一个单独的问题问这个问题。
@words = Word
  .where("german = ?", params[:word][:german] != 0")
  .order('word')
  .paginate(:page => params[:page])