我正在开发 Rails v2.3 应用程序,它是搜索项目信息的服务,其中项目信息存储在数据库中。
数据库中存在一个现有的projects
表,如下所示:
为了满足客户的要求,该表需要在每天午夜插入新数据。
创建这些新记录的原因是为了使Rails应用程序能够通过一个单词搜索项目,而不是通过全名搜索。
例如,如果按字词“门户”搜索,租车门户和位置跟踪门户记录应该由Rails应用程序找到。 这是应用程序。数据库需要包含 project_name
中每个单词的所有记录。
所以,我的计划是通过分割 project_name
列(上述projects
表格中的值)来生成这些新记录单个单词然后使用每个单词作为新记录 project_name
,同时保持记录的其他列不变。
例如,在上表中,第一条记录有project_name
“租车门户”,我要做的就是将此字符串拆分为3单词和构造要插入表格的以下三个新记录:
实现这一目标。我尝试进行 rake任务,它从原始projects
表中获取所有记录,对于每条记录, rake任务将字符串值{{ 1}}列成单词,然后用单词构造新记录并插入表中。我的 rake任务看起来像下面的代码:
project_name
rake任务运行良好,它会创建预期的新记录并插入all_records = ActiveRecord::Base.execute("select * from projects;")
all_records.each do |record|
user_id = record[0]
project_name=record[1]
department = record[2]
other = record[3]
words=project_name.split()
words.each do |word|
sql = "insert into project values (#{user_id},#{word},#{department},#{other});"
ActiveRecord::Base.execute(sql)
end
end
表,但问题是否需要 36小时完成!
这是可以理解的,因为原始表非常大,如果将字符串拆分为单词并创建新记录,就像创建一个大3倍的表(假设projects
的每个字符串有3个单词)。 / p>
我的问题:
一些Rails专家能否建议我实现上述新记录插入的更有效方法?
或者在我的情况下启用单字搜索的任何新方法? (这不是我使用我设计的方式将每个单词存储在数据库中。)
答案 0 :(得分:0)
如果您仅为搜索目的而这样做,为什么不使用Sunspot?它支持全文搜索。
拆分项目名称听起来对我来说真的不错。
但是如果你想减少时间,那么我建议你把这个单一的任务分成更多的rake任务,这样做也是如此,但对于其他项目来说。
答案 1 :(得分:0)
为了加快导入速度,您希望使用activerecord-import,它会使您的执行速度提高几个数量级。
columns = [:title, :project_name, :department, :other]
values = all_records.inject([]) do |values_arr, record|
user_id, project_name, department, other = record
project_name.split.each do |name|
values_arr << [user_id, name, department, other]
end
values_arr
end
class TempModel < ActiveRecord::Base; set_table_name "projects"; end
TempModel.import columns, values, :validate=>false