2011-04-23 65 views
0

目前,我有以下創建:導軌 - 如何使用查找或具有缺省值

conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id(conversation.id) 

這正確地創建了一個記錄,問題是conversation.read的默認值是假的。

在這個特定的方法中,我希望在創建記錄時默認值爲true。現在我得到這個工作的唯一方法是通過以下:

conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id(conversation.id) 
    conversation_participation.read = true 
    conversation_participation.save 

問題是這樣的命中DB的兩倍。我如何使用find_or_create並設置默認值:read => true?

感謝

回答

1

您可以嘗試find_or_initialize_by...

然後設置你的read屬性爲正常

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id(conversation.id) 
conversation_participation.read = true 
conversation_participation.save 

或者

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id_and_read(conversation.id, true) 
conversation_participation.save 

隨着after_initialize(哦..你刪除您的評論,但這裏是以防萬一爲)

class Conversation < ActiveRecord::base 
    def after_initialize 
    self.read ||= true # true if not already set 
    end 
end 

然後,你可以做find_or_create|initialize_by...或曾經方式,你要繼續。

更多關於callbacks如果您有興趣,

+0

如果你想在那裏設置一個默認值,你可以看看'after_initialize' – nowk 2011-04-23 22:00:00

0

試試這個:

conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id_and_read(conversation.id, true) 
+0

等等,但這樣做不好,因爲如果一個conversation_participation存在與讀取false,這是非常有效的,這將創建一個新的記錄,不是? – AnApprentice 2011-04-23 21:50:33

+0

你是對的,沒有注意到這一點。 – edthix 2011-04-24 06:09:17

1

here

使用,如果你想返回一個新的紀錄 沒有保存它的find_or_initialize_by_ 取景器。

因此,像這樣:

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id(conversation.id) 
conversation_participation.read = true 
conversation_participation.save 

這應該只是做一個INSERT而不是INSERT後跟UPDATE