如何在 rails 中为多个枚举添加范围
How to add a scope for multiple enums in rails
我有一个 select 显示对象的所有枚举:
<%= f.select( :state_user
, User.states.keys.map {|state| [state.titleize,state] }) %>
如何创建允许我 select 多个状态的范围?
例如,我想过滤所有不活跃或暂停的用户。
谢谢
我在这个范围内使用它:
scope :state, lambda { |enum_ids|
return nil if enum_ids.empty?
objArray = []
enum_ids.each do |key|
if (User.estados[key])
objArray << User.estados[key]
end
end
return nil if objArray.empty?
where (["account.state in (?)" , objArray])
}
不确定您是否仍在寻找类似的东西,但这是我找到的。
解决方案
我能够使用以下方法实现这个
scope :for_states, -> (*state_names) {
where(state: states.values_at(*Array(state_names).flatten))
}
*state_names
参数将允许将任意数量的参数打包到一个 state_names
数组中。 Array(state_names)
确保如果传递了单个参数,它将被视为一个数组。最后,flatten
允许将单个数组作为参数传递。毕竟,splat (*
) 将此数组的所有元素解压为 values_at
方法的参数。
您可以按如下方式使用:
User.for_states :one_state
User.for_states :state_1, :state_2
User.for_states [:state_1, :state_2]
如果你不需要方法那么灵活,可以简化它。
未来
根据 Edge Rails Docs 这在 Rails 5 中应该更简单,您将能够做到
User.where(state: [:state_1, :state_2])
我有一个 select 显示对象的所有枚举:
<%= f.select( :state_user
, User.states.keys.map {|state| [state.titleize,state] }) %>
如何创建允许我 select 多个状态的范围?
例如,我想过滤所有不活跃或暂停的用户。
谢谢
我在这个范围内使用它:
scope :state, lambda { |enum_ids|
return nil if enum_ids.empty?
objArray = []
enum_ids.each do |key|
if (User.estados[key])
objArray << User.estados[key]
end
end
return nil if objArray.empty?
where (["account.state in (?)" , objArray])
}
不确定您是否仍在寻找类似的东西,但这是我找到的。
解决方案
我能够使用以下方法实现这个
scope :for_states, -> (*state_names) {
where(state: states.values_at(*Array(state_names).flatten))
}
*state_names
参数将允许将任意数量的参数打包到一个 state_names
数组中。 Array(state_names)
确保如果传递了单个参数,它将被视为一个数组。最后,flatten
允许将单个数组作为参数传递。毕竟,splat (*
) 将此数组的所有元素解压为 values_at
方法的参数。
您可以按如下方式使用:
User.for_states :one_state
User.for_states :state_1, :state_2
User.for_states [:state_1, :state_2]
如果你不需要方法那么灵活,可以简化它。
未来
根据 Edge Rails Docs 这在 Rails 5 中应该更简单,您将能够做到
User.where(state: [:state_1, :state_2])