首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在记录的数组属性中查找包含id的记录

在记录的数组属性中查找包含id的记录
EN

Stack Overflow用户
提问于 2015-06-15 06:23:43
回答 2查看 122关注 0票数 0

我有一个带有Exam字段的lang_array模型

代码语言:javascript
运行
复制
Exam.last.lang_array #=> "1,2,5"

我想找到所有有特殊身份的考试。我在这样的一次考试中就做到了:

代码语言:javascript
运行
复制
Exam.last.lang_array.split(',').map(&:to_i).include? 1

怎样才能在所有的考试中做到这一点,并有效地找到记录呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 07:36:18

在单个数据库列中序列化in列表时,无法有效地执行搜索。为了执行有效的查找,数据库使用索引,但不能以这种方式对聚合数据进行索引。

正确构建数据库的方法是使用关系。如果考试模型可以有很多"lang",那么添加一个新的表来正确地表示这种关系。如果lang表示的ID是另一个数据库模型,那么这将成为一个多到多的关系。

例如,您可以添加一个模型ExamLang,其中有两个字段:考试ID和lang ID。每条记录代表一个关系。

当您想获取包含特定lang id的所有考试时,这将像一个简单的SELECT语句一样容易。

没有有效的方法来查找通过lang ID进行的考试,否则。您必须执行一个完整的扫描(包括一个完整的DB表扫描和Ruby端的整个循环),这是效率低下的。

票数 2
EN

Stack Overflow用户

发布于 2015-06-15 08:27:02

是的,我同意西蒙妮的回答。您必须更改您的模式,以适应许多到许多关系。

但是无论如何,如果您想要基于存储为属性中字符串的数组中的条目来查找记录,则可以执行以下操作

代码语言:javascript
运行
复制
Exam.where(["REPLACE(lang_array, ' ', '') REGEXP '/*,1,/*|/*1,/*|/*,1'"])

如果Rails < 2.3

代码语言:javascript
运行
复制
Exam.find(:all,:conditions =>["REPLACE(lang_array, ' ', '') REGEXP '/*,1,/*|/*1,/*|/*,1'"])

其中1是id。

PS:请注意它是特定于MySQL的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30838524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档