具有两个参数的范围 rails
Scope with two parameters rails
我正在关注 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=&created_between[from]=&created_between[to]=
(虽然我没有提交任何日期,但 date_field 也通过了)。 /users/search?age=21&created_between[from]=&created_between[to]=
当我只提交年龄时。
我的问题是,每当我尝试为 created_between
范围提交两个日期时,我都会收到 wrong number of arguments (1 given, expected 2)
错误。我不确定我是否正确提交了日期字段。
如何将两个需要的参数传递给范围?或者我应该换一种方式吗?
有时候把问题写出来似乎会让事情变得更清楚。但是,解决方案是将 :created_between
的作用域函数更改为:
scope :created_between, -> (date) {where(created_at: date[:from]..date[:to])}
我正在关注 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=&created_between[from]=&created_between[to]=
(虽然我没有提交任何日期,但 date_field 也通过了)。 /users/search?age=21&created_between[from]=&created_between[to]=
当我只提交年龄时。
我的问题是,每当我尝试为 created_between
范围提交两个日期时,我都会收到 wrong number of arguments (1 given, expected 2)
错误。我不确定我是否正确提交了日期字段。
如何将两个需要的参数传递给范围?或者我应该换一种方式吗?
有时候把问题写出来似乎会让事情变得更清楚。但是,解决方案是将 :created_between
的作用域函数更改为:
scope :created_between, -> (date) {where(created_at: date[:from]..date[:to])}