2010-02-11 43 views
0

我正在尋找一種在我的rails應用程序中解決性能問題的好方法。我有三個表格,它們之間有一對一到多個連接。如果我想用第一個表格的130個項目填充下面表格的所有數據,那麼結果大約有1000個查詢,大約需要10秒(SQLite數據庫)。Rails:將大量數據導入到三個連接的表

我發現

accept_nested_attributes_for

聲明,巫婆讓您一行代碼多個表輸入數據。我的問題是,從性能的角度來看,這是一個很好的選擇。有人有任何經驗嗎?

感謝 馬庫斯

+0

1000查詢?聽起來很奇怪,你能告訴我們表格和你正在查詢的問題的細節, – Mike 2010-02-11 11:49:56

回答

0

accept_nested_attributes_for添加到的ActiveRecord能夠直接從一個模型寫入關聯的可能性。

爲例: 你有模型,如:

class User 
    accepts_nested_attributes_for :cars 
end 

class Car 
belongs_to :user 
end 

和如哈希:

param[:user] = {} 
params[:user][:name] = "Mike" 
params[:user][:car] = {} 
params[:user][:car][:brand] = "Nissan" 

User.create(params[:user]) 

這將創建一個新用戶和新汽車, 沒有accepts_nested_attributes_for

@user = User.create(params[:user]) 
@car = Car.create(params[:user][:car]) 
@user.car = @car 

此功能通常在HTML窗體中使用fields_for,因此您可以輕鬆處理創建對象及其關聯。

在你的情況我想,你的模型一樣,(關於你的XML):

class Card 
    has_one :front_side, :class => "Side" 
    has_one :back_side, :class => "Side" 
end 

class Side 
    belongs_to :card 
    has_many :card_side_entry 
end 

class CardSideEntry 
    belongs_to :side 
end 

我不知道你的XML來自(您的數據,從中提取?),但我想你可以使用accept_nested_attributes_for,這樣你就可以讓每個卡片散列生成關聯。 但我不確定要了解所有問題,如果這是最佳解決方案

+0

謝謝麥克,是的,我按照你的想象去做。我想知道這個accept_nested_attributes是否有效,確實有很多數據。感謝您的回答 – Markus 2010-02-11 16:24:59

0

那就是:

Table: cards 
front_side_id 
back_side_id 

Table: card_sides 

Table: card_side_entries 
card_side_id 

我有現在這樣的XML:

<Cards> 
    <Card> 
    <FrontSide> 
     <CardSideEntries> 
     <CardSideEntrie/> 
     ... 
     </CardSideEntries> 
    </FrontSide> 
    <BackSide> 
     <CardSideEntries> 
     <CardSideEntrie/> 
     ... 
     </CardSideEntries> 
    </BackSide> 
    </Card> 
    ... 
</Cards> 

在我的解決方案,我用線解析整個XML文件中的行,因爲我有時需要一個card_id我必須保存一個特定的表項兩次......現在有人有關於accept_nested_attributes_for的一些信息嗎?

感謝, 馬庫斯