ActiveRecord按模型的数组属性查找,其中包含一个值(不是关联数组)

rya*_*an0 3 sql activerecord ruby-on-rails-3

我有一个Rails模型,其属性是一个数据值数组(字符串).我想做一个ActiveRecord find,它返回任何数组包含特定值的记录.有没有办法用ActiveRecord做到这一点,这会使它比迭代更高效?

Dyl*_*kow 7

由于Rails默认使用YAML序列化数组,因此很难进行"包含值"查询.

如果您的值是唯一的并且是固定集的一部分(例如,有一roles['User', 'Admin', 'Guest']),您可以执行以下操作:

User.where("roles ilike '%\n- Guest\n%'")
Run Code Online (Sandbox Code Playgroud)

因为那将匹配YAML ---\n- User\n- Admin\n Guest\n.

或者,您可以在Postgres中使用本机数组类型.在Rails 3中,你需要使用activerecord-postgres-array gem(虽然我不知道这是多么好维护); 在Rails 4中,它本机支持.

您可以这样设置列:

t.string :roles_array, :array => true, :length => 30
Run Code Online (Sandbox Code Playgroud)

然后你可以查询它:

User.where("'Guest' = ANY(roles_array)")
Run Code Online (Sandbox Code Playgroud)