gpt4 book ai didi

ruby-on-rails - 是否有一种优雅的单行代码可以使用 .send() 附加存储在数组中的范围?

转载 作者:数据小太阳 更新时间:2023-10-29 07:56:58 26 4
gpt4 key购买 nike

这是我的

目前,我正在这样做:

current_account.send(object).search(params[:search]).user_id_equals_any(users).visibility_is_any(visibilities)

但这不是很灵活吗?如果我想有条件地不拥有这些范围之一怎么办?

我认为带有条件添加元素的作用域数组是一个很好的解决方案

我将使用 .send() 调用的参数数组

scopes = []    
scopes = << [:user_id_equals_any, users] if filter_users
scopes = << [:visibility_is_any, visibilities] if filter_visibility

所以,我可以有一些未知的数字范围。

要执行作用域,我需要调用 .send(:scope_name, scope_param)

但是我如何为我的 scopes 数组中的任意数量的范围执行此操作?

作为一个循环,我想应该是这样的

result = current_account.send(object).search(params[:search])
scopes.each do |scope|
result.send(scope[0], scope[1])
end
return result

循环可以简化为

scopes.each {|s| result.send(s[0], s[1]) }

但是有没有办法在一行中附加不同的发送调用?

最佳答案

您可以使用 inject :

scopes = []
# Note that in your example, the assignment is invalid syntax
scopes << [:user_id_equals_any, users] if filter_users
scopes << [:visibility_is_any, visibilities] if filter_visibility

# initial result
result = current_account.send(object).search(params[:search])

# applying the scopes
result = scopes.inject(result) do |result, (method, param)|
result.send(method, param)
end
return result

在每个循环中,前一个 block 执行的最后一个返回值被传递给 block 的第一个参数,在本例中为 result。第一个循环获取初始结果(即 inject 调用方括号中的参数。返回最后一个循环的返回值。

有关更多详细信息,请查看 the documentation .

关于ruby-on-rails - 是否有一种优雅的单行代码可以使用 .send() 附加存储在数组中的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com