2014-02-27 49 views
1

假設我有模型Ant和具有第三個加入模型貓的Bats。對於每個A,我都有一列包含我想要加入該行的所有Cs的ID。目前我執行以下操作:通過導軌填充has_many的快速方法

Ant.all.each do |ant| 
    ant.cat_ids.split(",").each do |id| 
    ant.cats<<Bat.find(id) 
    end 
end 

但是這很慢。任何人都知道更快的方式?

+0

您正在使用什麼數據庫?這裏的表現是首要任務嗎? – gertas

+0

postgresql;是的性能是第一優先 – kempchee

+0

在PostgreSQL的情況下嘗試'regexp_split_to_array'或'regexp_split_to_table'。你可以INSERT ... SELECT ...和數據庫將爲你做所有骯髒的工作。 – gertas

回答

1

插入使用直接SQL是做的最快方法本

ant_cat_ids = [] 
Ant.all.each do |ant| 
    ant_cat_ids += ant.cat_ids.split(",").collect{|cat_id| "(#{ant.id}, #{cat_id})"} 
end 
Ant.connection.execute("INSERT INTO cats(ant_id, cat_id) VALUES #{ant_cat_ids.join(", ")}") 
0

好一點:

Ant.all.each do |ant| 
    ant.cats << Bat.find(ant.cat_ids) 
end