【问题标题】:Scope with two parameters rails具有两个参数的范围
【发布时间】:2020-05-10 14:24:06
【问题描述】:

我正在关注this tutorial 在我的 Rails 应用程序中实现过滤功能。我希望管理员能够按年龄、标识符和创建用户的日期间隔进行过滤。这是最后一点让我有些头疼。

在我的模型 user.rb 中,我定义了以下范围:

scope :created_between, -> (startdate, enddate) {where(created_at: startdate..enddate)}
scope :identified, -> { where.not(identifier: [nil, '']) }
scope :age, -> (age) { where("age > ?", age)}

在我的控制器 users_controller.rb 中,我使用一个函数来过滤参数:

def search 
 filter = params.slice(:age, :created_between, :identified)

 filter.each do |key, value|
   if value.present?
        @users = @users.public_send(key,value)
   else
        @users = @users.public_send(key)
   end
 end
end

我区分一个值是否存在,因为 :identified 范围是作为一个复选框实现的,因此不会传递类似的值

最后,我在 view.html.erb 文件中为所有可能的过滤器创建了一个表单:

<%= form_tag users_search_path, :method => :get, :enforce_utf8 => false do %>
  <%= date_field :created_between, "from" %>
  <%= date_field :created_between, "to" %>
  <%= check_box_tag :identified, '', false %>
  <%= text_field_tag :age, "age" %>
<% end %>

年龄和已识别作品的过滤器。当我提交表单时,查询变为/users/search?identified=&amp;created_between[from]=&amp;created_between[to]=,而我只选中了标识的复选框(尽管我没有提交任何日期,但 date_field 也通过了)。和/users/search?age=21&amp;created_between[from]=&amp;created_between[to]= 当我只提交一个年龄时。

我的问题是,每当我尝试为 created_between 范围提交两个日期时,我都会收到 wrong number of arguments (1 given, expected 2) 错误。我不确定我是否正确提交了日期字段。

如何将两个需要的参数传递给作用域?还是我应该用另一种方式来代替?

【问题讨论】:

    标签: ruby-on-rails search filter scoping


    【解决方案1】:

    有时只是写出问题似乎会让事情变得更清楚。但是,解决方案是将:created_between 的作用域函数更改为:

    scope :created_between, -> (date) {where(created_at: date[:from]..date[:to])}
    

    【讨论】:

    • 您必须在提交前使用Javascript禁用空输入字段。 $(':input[value=""]').attr('disabled', true);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2021-03-27
    • 2020-09-22
    • 2022-10-15
    • 2015-09-08
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多