2011-11-24 55 views
1

假設我有一個充滿顏色值(如「#EE3AA」)的mysql表格。我有一個模型,它有一個顏色屬性,這是強制性的(應該驗證),但不一定需要由用戶輸入。如果用戶留空,我希望它自動使用從另一個表中選擇的隨機值進行填充,但默認情況下並不總是相同的值。如何獲得MySQL/Rails中列的隨機默認值

我想,也許,我可以使用遷移做到這一點,所以它是這樣的:

... :default => "values of the color column of the Colors table".to_a.sample 

我的想法可能不正確/法律在Ruby中的條款。在遷移文件中看到:default選項後,我認爲每次創建模型時都會運行遷移文件。但讀米哈伊爾的評論,這可能並非如此。但無論如何,當用戶沒有提供任何值時,如何從另一個表中獲得一個隨機值?

+0

這是不是很清楚你在問什麼。將數據提取到遷移文件中意味着什麼? –

+2

在我看來最好將這個邏輯移入模型鉤子(before_save)中,它會更易於維護和測試。 –

+0

對不起,這個問題的模糊性和遲到的回報。我編輯了這個問題。 – barerd

回答

1

只有在創建數據庫或對數據庫結構進行更改時纔會運行遷移,而不是在保存新記錄時運行。米哈伊爾建議回撥before_save是正確的。你可以做這樣的事情在你的模型:

class Model < ActiveRecord::Base 
    before_save :set_empty_color_to_random_value 

    def set_empty_color_to_random_value 
    self.color = Color.order("RANDOM()").first.color if self.color.empty? 
    end 
end 

注意RANDOM()作品PostgreSQL和SQLite的,而不是爲MySQL。對於MySQL,您必須改用RAND()

+0

+1很好的答案,在rails和基於模型。不錯的工作。任何想法使用該rspec測試? –

+0

@MichaelDurrant,謝謝。我以爲我看到一個談論關於測試隨機數的Railscast,但我找不到它。如果我要爲此編寫一個測試,我只需檢查顏色屬性保留爲空時保存後不再爲空。我還會測試顏色表中存在的值。我會對測試的建議感興趣,它真的是一個隨機值。 – Mischa

+0

感謝您的回答。我明白了這一點。因此,即使我在遷移文件中有這樣一行:「t.integer:cost,:default =>(5..12).to_a.sample」,它不會影響新創建的模型,它應該位於一個before_save函數。 – barerd