查找在记录的数组属性中包含 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 具体的。
我有一个带有 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 具体的。