【问题标题】:How to add a scope for multiple enums in rails如何在 Rails 中为多个枚举添加范围
【发布时间】:2015-07-17 08:25:26
【问题描述】:

我有一个显示对象所有枚举的选择:

<%= f.select( :state_user 
            , User.states.keys.map {|state| [state.titleize,state] }) %>

如何创建一个允许我选择多个状态的范围?

例如,我想过滤所有不活动或暂停的用户。

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby enums scope


    【解决方案1】:

    不确定您是否仍在寻找类似的东西,但这是我找到的。

    解决方案

    我能够使用以下方法实现这一点

    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])
    

    【讨论】:

      【解决方案2】:

      我让它在这个范围内工作:

       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])
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        相关资源
        最近更新 更多