2015-06-20 62 views
3

比方說,我有一個名爲Task的模型。我想find_or_create_by一些任務。Rails find_or_create_by with/without where

t = Task.where(done: false).find_or_create_by(title: 'epic') 

這個模型的工作,但創建任務與title等於史詩done等於假。我想通過done查詢搜索等於false,但我不希望新記錄done等於false。我該怎麼做?

+0

http://stackoverflow.com/a/21190577/2697183。你可以重寫'done'的值,如果一個新的實例被創建 – AbM

+0

感謝您的鏈接,但它們使用'first_or_create'已過時我認爲 – asiniy

回答

4

您可以使用一些名爲find_or_initialize_by的東西。它只初始化記錄,但不創建它。這樣,您以後可以替換的屬性:

task = Task.where(done: false).find_or_initialize_by(title: 'epic').first 
task.done = true # or nil or whatever you want! 
task.save 

我只保存了第一條記錄與task.done = true。如果有多條記錄,則可以使用each遍歷所有記錄,並將其全部保存。

編輯:

Task.where(:done => false).first_or_initialize do |task| 
    task.done = true 
    task.title = 'epic' 
end 
+0

謝謝!這會起作用,但是這個代碼有點過剩,不是嗎? – asiniy

+0

我編輯了我的答案。您也可以使用其他方法。 –

+0

這件事很有效,但這不是我的情況。謝謝你的回答 – asiniy