【问题标题】:new records insertion into database table in my case在我的情况下,新记录插入到数据库表中
【发布时间】: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


    【解决方案1】:

    如果您这样做只是为了搜索,为什么不使用 Sunspot ?支持全文搜索。

    拆分项目名称对我来说听起来是个坏主意。

    但是,如果您想花更少的时间,那么我鼓励您将这个单一的任务拆分为更多的 rake 任务,这会做同样的事情,但对于其他项目集。

    【讨论】:

      【解决方案2】:

      为了加快导入速度,您想使用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
      

      【讨论】:

      • 您好,projects表实际上并没有映射到项目中的任何模型对象。实际上,与真实项目相比,这里的所有名称都是假的。那就是没有模型映射到表。
      • 。 . .所以只需定义一个模型以使 rake 任务更容易。以我的编辑为例。
      • 与我的帖子中的设计相比,是否有粗略的估计?快 2.3 倍?
      • 此外,这个 activerecord-import 库用于 Rails 3 及更高版本,但正如我在帖子中提到的,我使用的是客户需要的 Rails V2.3。
      • 你可以在 2.3 及以下版本中使用 ar-extensions gem,它包含所有与 activerecord-import 相同的功能
      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 2019-08-19
      • 2023-04-08
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      相关资源
      最近更新 更多