【发布时间】:2015-07-17 08:25:26
【问题描述】:
我有一个显示对象所有枚举的选择:
<%= f.select( :state_user
, User.states.keys.map {|state| [state.titleize,state] }) %>
如何创建一个允许我选择多个状态的范围?
例如,我想过滤所有不活动或暂停的用户。
谢谢
【问题讨论】:
标签: ruby-on-rails ruby enums scope
我有一个显示对象所有枚举的选择:
<%= f.select( :state_user
, User.states.keys.map {|state| [state.titleize,state] }) %>
如何创建一个允许我选择多个状态的范围?
例如,我想过滤所有不活动或暂停的用户。
谢谢
【问题讨论】:
标签: ruby-on-rails ruby enums scope
不确定您是否仍在寻找类似的东西,但这是我找到的。
我能够使用以下方法实现这一点
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_stateUser.for_states :state_1, :state_2User.for_states [:state_1, :state_2]如果您不需要方法那么灵活,可以简化它。
根据Edge Rails Docs,这在 Rails 5 中应该更简单,您将能够做到
User.where(state: [:state_1, :state_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])
}
【讨论】: