我的Exam
模型带有lang_array
字段
Exam.last.lang_array #=> "1,2,5"
我想找到所有具有特定ID的考试。 我能够为这样的一次考试做到这一点:
Exam.last.lang_array.split(',').map(&:to_i).include? 1
如何为所有考试做到这一点并有效地找到记录?
答案 0 :(得分:2)
在单个数据库列中序列化ID列表时,无法有效执行搜索。为了执行有效的查找数据库,请使用索引,但不能以这种方式索引聚合数据。
正确构建数据库的方式是建立关系。如果考试模型可以有许多“lang”,那么添加一个正确表示这种关系的新表。如果lang表示的ID是另一个数据库模型,那么这将成为多对多的关系。
例如,您可以添加一个模型ExamLang,其中包含两个字段:考试ID和lang ID。每条记录代表一种关系。
当您想要获取包含特定lang id的所有Exam时,这将像简单的SQL SELECT语句一样简单。
没有有效的方法可以通过lang ID查找考试。您将不得不执行完整扫描(完整的数据库表扫描和Ruby端的整个循环),这是低效的。
答案 1 :(得分:1)
是的,我选择了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的。