【问题标题】:Filtering a list using checkboxes使用复选框过滤列表
【发布时间】:2012-06-12 01:44:52
【问题描述】:

我有一个电影列表以及它们的收视率。在我的页面顶部,我有一个表单,它提供了一个复选框列表,显示了每个可用的评级(G、PG-13 等)。一旦用户点击复选框并点击提交,我只想显示所选电影。

在我的索引方法中,我有一个名为@filtered_ratings 的实例变量,它从检查的电影中收集密钥。我的想法是使用 find 方法更改控制器中的@movies 并将@filtered_ratings 中的键与电影列表匹配。但是,我认为我做错了,因为我无法让它工作。我尝试了几种方法,例如@movies=Movie.find(params[:id] = @filtered_ratings),但我知道这是不正确的。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby checkbox find


    【解决方案1】:

    假设您的复选框表单类似于:

    <%= form_tag method: (blah), url: (blah) do %>
       <%= check_box_tag 'ratings[]', "R" %>
       <%= check_box_tag 'ratings[]', "PG" %>
      <%= check_box_tag 'ratings[]', "PG-13" %>
      <%= submit_tag 'Submit' %>
    <% end %>
    

    如果说前两个框被选中,你会得到 params[:ratings] = ["R", "PG"]。所以,在控制器中你可以这样做

    Movie.where("rating IN (?)", params[:ratings])
    

    。这假设您的电影具有“评分”属性。

    【讨论】:

    • 你的假设是对的;但是,我只是使用一个块来生成所有内容。此外,当我将控制器更改为您建议的代码时,它会完全删除电影列表。最后,我们被明确告知find 是最简单的方法。
    • 如果你必须使用'find',你可以使用Movie.find(:all, conditions: ["rating IN (?)", params[:ratings]]),但是这个产生相同的 SQL 查询。如果此代码删除电影列表,则 params[:ratings] 可能为 nil 或为空。您在 params 哈希中看到了哪些值?
    • 在我的索引页面的顶部,我输入了=params[:ratings].keys,呈现的值是选中框的值。所以我确定 params 哈希不为空。
    • "rating IN (?)" 是一个 SQL 条件。 Rails 将问号替换为第二个参数,在本例中是一个数组。因此 SQL 将返回所有具有“评级”的记录,该评级是数组中的任何一个值。
    • @movies = Movie.where(:rating =&gt; @filtered_ratings) 也同样有效
    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2014-03-08
    • 2015-06-14
    相关资源
    最近更新 更多