Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在我的案例中,新记录插入到数据库表中_Ruby On Rails_Ruby On Rails 3_Activerecord_Ruby On Rails 3.1_Rake - Fatal编程技术网

Ruby on rails 在我的案例中,新记录插入到数据库表中

Ruby on rails 在我的案例中,新记录插入到数据库表中,ruby-on-rails,ruby-on-rails-3,activerecord,ruby-on-rails-3.1,rake,Ruby On Rails,Ruby On Rails 3,Activerecord,Ruby On Rails 3.1,Rake,我正在开发一个Rails v2.3应用程序,它是一种搜索项目信息的服务,项目信息存储在数据库中 数据库中存在如下所示的现有项目表: 为了满足客户的需求,该表需要每天午夜插入新数据 创建这些新记录的原因是,Rails应用程序除了按全名搜索外,还可以按单个单词搜索项目 例如,如果按word门户搜索,Rails应用程序应同时找到租车门户和位置跟踪门户记录。这就是应用程序的数据库需要有project_name中每个单词的所有记录 因此,我的计划是通过将上述projects表的project_name列中

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

数据库中存在如下所示的现有项目表:

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

创建这些新记录的原因是,Rails应用程序除了按全名搜索外,还可以按单个单词搜索项目

例如,如果按word门户搜索,Rails应用程序应同时找到租车门户和位置跟踪门户记录。这就是应用程序的数据库需要有project_name中每个单词的所有记录

因此,我的计划是通过将上述projects表的project_name列中的值拆分为单个单词来生成这些新记录,然后将每个单词用作新记录的project_名称,同时保持记录的其他列不变

例如,在上表中,第一条记录有project_name Car rental portal,我要做的是将此字符串拆分为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倍的表,假设项目名称的每个字符串有3个单词

我的问题:

一些Rails专家能给我一些更有效的方法来实现我上面描述的新记录插入吗

或者在我的案例中有没有新的方法来启用单词搜索?这不是我设计的在数据库中存储每个单词的方式


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

拆分项目名称对我来说是个非常糟糕的主意


但是如果你想花更少的时间,那么我鼓励你把这个任务分成更多的rake任务,这也会做同样的事情,但是对于其他的项目集来说

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

拆分项目名称对我来说是个非常糟糕的主意


但是如果你想花更少的时间,那么我鼓励你把这个任务分成更多的rake任务,这也会做同样的事情,但是对于其他的项目集来说

对于您想要使用的更快的导入,它将使您的执行速度提高几个数量级

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

为了更快地导入,您需要使用它,它将使您的执行速度提高几个数量级

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

您好,项目表实际上没有映射到项目中的任何模型对象。实际上,与真实项目相比,这里所有的名字都是假的。也就是说,没有映射到表的模型。因此,只需定义一个模型,使rake任务更容易。请看我的编辑以获取一个例子。是否有任何粗略的估计,它比我在帖子中的设计快多少?2.3倍?此外,这个activerecord导入库用于Rails 3及更高版本,但正如我在文章中提到的,我使用的是Rails V2.3,这是客户所需要的。您可以使用2.3及以下版本的ar扩展gem,它包含与activerecord导入库相同的所有功能,项目表实际上没有映射到项目中的任何模型对象。实际上,与真实项目相比,这里所有的名字都是假的。也就是说,没有映射到表的模型。因此,只需定义一个模型,使rake任务更容易。请看我的编辑以获取一个例子。是否有任何粗略的估计,它比我在帖子中的设计快多少?2.3倍?此外,这个activerecord导入库用于Rails 3及更高版本,但正如我在文章中提到的,我使用的是Rails V2.3,这是客户所需要的。您可以使用2.3及以下版本的ar extensions gem,它包含与activerecord导入相同的所有功能