2

我開發一個的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任務將字符串值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的專家建議我一些更有效的方式來實現我上述的新記錄插入的事情嗎?

  • 或者任何新的方法來啓用單詞搜索在我的情況? (這是不使用我設計爲數據庫中的每個單字專賣店的方式。)

回答

0

如果僅用於搜索目的這樣做,你爲什麼不使用Sunspot?它支持全文搜索。

分裂項目名稱聽起來對我來說真的是個壞主意。

但是如果你想花更少的時間,那麼我鼓勵你把這個單一的任務分成更多的耙子任務,這樣做也是如此,但是對於其他項目集合。

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 
+0

嗨,項目表實際上沒有映射到項目中的任何模型對象。其實所有的名字都是假的,與真實的項目相比。這是沒有模型映射到表。 – Mellon

+0

。 。 。所以只需定義一個模型來簡化耙子任務。有關示例,請參閱我的編輯。 – klochner

+0

有沒有對我的文章中的設計比它快多少的粗略估計?快2,3倍? – Mellon

相關問題