在我的情况下,新记录插入到数据库表中

时间:2011-11-20 21:10:57

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1 rake

我正在开发 Rails v2.3 应用程序,它是搜索项目信息的服务,其中项目信息存储在数据库中。

数据库中存在一个现有的projects表,如下所示:

enter image description here

为了满足客户的要求,该表需要在每天午夜插入新数据。

创建这些新记录的原因是为了使Rails应用程序能够通过一个单词搜索项目,而不是通过全名搜索。

例如,如果按字词“门户”搜索,租车门户位置跟踪门户记录应该由Rails应用程序找到。 这是应用程序。数据库需要包含 project_name中每个单词的所有记录。

所以,我的计划是通过分割 project_name (上述projects表格中的值)来生成这些新记录单个单词然后使用每个单词作为新记录 project_name,同时保持记录的其他列不变。

例如,在上表中,第一条记录有project_name租车门户”,我要做的就是将此字符串拆分为3单词和构造要插入表格的以下三个新记录

enter image description here

实现这一目标。我尝试进行 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专家能否建议我实现上述新记录插入的更有效方法?

  • 或者在我的情况下启用单字搜索的任何新方法? (这不是我使用我设计的方式将每个单词存储在数据库中。)

2 个答案:

答案 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