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

Finding records which includes an id in an array attribute of the records

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

Exam.last.lang_array #=> "1,2,5"

我想查找所有具有特定 ID 的考试。 我能够像这样完成一次考试:

Exam.last.lang_array.split(',').map(&:to_i).include? 1

如何为所有考试执行此操作并高效地查找记录?

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

正确构建数据库的方法是建立关系。如果考试模型可以有很多 "lang",则添加一个新的 table 来正确表示这种关系。如果lang代表的ID是另外一种数据库模型,那么就会变成多对多的关系。

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

当您想要获取包含特定语言 ID 的所有考试时,这就像一个简单的 SQL SELECT 语句一样简单。

否则没有通过语言 ID 查找考试的有效方法。您将必须执行完全扫描(包括完整的数据库 table 扫描和 Ruby 端的整个循环),这是低效的。

是的,我同意 Simone 的回答。您必须更改架构以适应多对多关系。

但是无论如何,如果您想根据在属性中存储为字符串的数组中的条目查找记录,您可以执行类似

的操作
Exam.where(["REPLACE(lang_array, ' ', '') REGEXP '/*,1,/*|/*1,/*|/*,1'"])

如果Rails < 2.3

Exam.find(:all,:conditions =>["REPLACE(lang_array, ' ', '') REGEXP '/*,1,/*|/*1,/*|/*,1'"])

其中 1 是 ID。
PS:请注意它是 MySQL 具体的。