如何在 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 方法的参数。

您可以按如下方式使用:

  1. User.for_states :one_state
  2. User.for_states :state_1, :state_2
  3. User.for_states [:state_1, :state_2]

如果你不需要方法那么灵活,可以简化它。

未来

根据 Edge Rails Docs 这在 Rails 5 中应该更简单,您将能够做到

User.where(state: [:state_1, :state_2])