【发布时间】:2011-11-20 21:10:56
【问题描述】:
我正在开发一个 Rails v2.3 应用程序,它是一种用于搜索项目信息的服务,其中项目信息存储在数据库中。
数据库中有一个现有的projects 表,如下所示:
为了满足客户的需求,该表需要在每天深夜插入新数据。
创建这些新记录的原因是为了让 Rails 应用程序除了按全名搜索外,还可以按单个词搜索项目。
例如,如果按单词“portal”搜索,租车门户和位置跟踪门户 Rails 应用程序应该可以找到记录。 那是应用程序的数据库需要有来自 project_name的每个单词的所有记录。
所以,我的计划是通过将值拆分 project_name 列(上述projects 表)生成这些新记录单词,然后使用每个单词作为新记录的project_name,同时保持记录的其他列不变。
例如,在上表中,第一条记录有project_name“租车门户”,我要做的就是把这个字符串分成3个词和构造以下三个新记录以插入到表中:
为了实现这一点。我尝试制作一个 rake 任务,它从原始 projects 表中获取所有记录,并且对于每条记录,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
rake 任务运行良好,它创建了预期的新记录并插入到projects 表中,但是问题是它需要 36 小时 完成!
可以理解,因为原始表非常非常大,如果将字符串拆分为单词并创建新记录,就像创建一个大3倍的表(假设project_name的每个字符串有3个单词)。
我的问题:
一些 Rails 专家能否建议我一些更有效的方法来实现我上面描述的新记录插入?
或者在我的情况下启用单字搜索的任何新方法? (那是不要使用我设计的将每个单词存储在数据库中的方式。)
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1 rake