2011-11-17 57 views
0

我有一個quality_code字段,它是由用戶輸入的自由文本。但是,某些已知的代碼具有更長的描述。如果已知代碼存儲在記錄中,我希望顯示說明代替代碼。模擬非關聯表的熱切加載

我在模型上有一個簡單的方法來顯示描述(如果可用)或輸入的quality_code(如果沒有),但它落入繪製n個項目列表所需的n + 1個查詢的典型模式:

def view_quality_code 
    if (code = QualityCode.find_by_quality_code(quality_code)).nil? 
    quality_code 
    else 
    code.description 
    end 
end 

如果模型實際上是鏈接(belongs_to :quality_code),那麼我會排序了這一點通過增加includes(:quality_code)到查詢,所以它只是做一個額外的查詢到quality_code表。

有沒有一種簡單的方法來做同樣的事情沒有模型被鏈接?

+0

你爲什麼不連接的模式? –

+0

因爲我無法控制quality_code字段中的輸入(我無法拒絕未知值)。我需要在每次輸入一些隨機文本時在質量代碼表中創建存根條目,或者有兩個字段:quality_code_text和quality_code_id – asc99c

+0

如果是我,我可能會鏈接模型並在運行中創建新條目。這可以確保任何輸入*成爲未來用戶的已知代碼 - 是你想要的嗎? –

回答

1

不知道你的其他模型叫什麼,我會假裝它是「Widget」。假設你已經部件組成的數組,像這樣:

widgets = Widget.all 

您可以僞造的預先加載自己是這樣的:

@codes = QualityCode.where(:quality_code => widgets.map(&:quality_code).uniq).group_by(&:quality_code) 

def view_quality_code 
    if codes = @codes[quality_code] 
    codes[0].description 
    else 
    quality_code 
    end 
end 
+0

這看起來不錯。由於QualityCode表非常小,因此我只是使用散列[QualityCode.all.collect {| c | [c.quality_code,c.description]}]構建散列,並且它似乎工作得更好。 – asc99c

相關問題