2013-01-15 186 views
2

我做類似這些railscast情節的東西:如何更新給定ID的列表中的所有車型布爾屬性?

http://railscasts.com/episodes/165-edit-multiple

http://railscasts.com/episodes/52-update-through-checkboxes

的問題是,那些只試圖修改選擇的車型。我需要更新每一個模型。

我發現的第一件事情是,id not in()不給後面一切都像我的預期,所以我不得不做出對空列表的一個特例。

此代碼的工作,但它似乎並不很乾。至少我應該能夠將正常情況合併爲一行。

def update_published 
    if params[:book_ids].empty? 
    Book.update_all(published: false) 
    else 
    Book.where(id: params[:book_ids]).update_all(published: true) 
    Book.where("id not in (?)", params[:book_ids]).update_all(published: false) 
    end 
    redirect_to books_path 
end 

改進的任何想法,將不勝感激。

回答

2

爲什麼不只是做到以下幾點:

def update_published 
    Book.update_all(published: false) 
    Book.where(id: params[:book_ids]).update_all(published: true) 
    redirect_to books_path 
end 

這將是更快,這是非常簡單和乾淨。

+0

感謝。這絕對是在代碼方面的改進。我認爲你是對的,它會更快,因爲它不需要做兩次相同的搜索。不過,我有點擔心它會將大多數模型更新兩次。 – Geoff

0

我終於想通了。

def update_published 
    Book.update_all(["published = id in (?)", params[:book_ids]]) 
    redirect_to books_path 
end 

我試圖做一些類似的昨天,但它不停地給我當?沒有填寫錯誤,它是做我的ID的where。今天,我終於意識到我需要將兩個參數包裝到一個數組中。這個

一個怪需要注意的是它搞砸了我的一些規格的。我正在檢查是否有錯誤,但是沒有給出。在數據庫中,它似乎設置爲false雖然。我改變了我的規格從be(false)be_false現在感覺很安全。

+0

我不會推薦編寫你自己的sql。然後你將被綁定到特定的數據庫類型,儘管許多具有相同的語法。 – Automatico

0

你可以做這樣的:

def update_published 
    Book.transaction do 
     Book.update_all(published: false) 
     Book.scoped.find(params[:book_ids]).update_all(published: true) #Should be Lazyloaded. Testing Now 
    end 
end 

因爲它是這將是非常快的交易。還請注意我如何使用「查找」,而不是「哪裏」。我認爲這更好。使代碼更簡潔。

注:我雖然問,爲什麼你每次都需要更新每一本書實體。一個接一個地正確追蹤出版的書籍會不會更聰明?如果您需要在每次更新一本書時都要通過每本圖書ID,那麼您一定會遇到麻煩。該解決方案不具有可擴展性。

什麼你應該是這樣的:

def publish_book(book) 
    book.published = true; 
    book.save! 
end 

甚至更​​好:

#Book.rb 
def publish 
    self.published = true 
    self.save #not 100% sure you need this. Anyone? 
end 

每當你可以你(許多人同意)應遵循 「瘦控制器,脂肪模型」 的做法。這意味着您基本上將盡可能多的代碼放入模型類中,而不是在任何時候都可以將其留空。

+0

這是關於將它包裝在交易中的極好的一點。關於'find'與'where''雖然我同意'find'會更漂亮,但它不起作用。 'find'將執行查詢(留給我一個'Array'),而'where'將它保存爲'ActiveRecord :: Relation'。我剛剛嘗試過,它給出了一個錯誤,因爲'Array'不響應'update_all'。 – Geoff

+0

哦..我沒有意識到找到數據。找一些人說,如果你做「Book.scoped.find(無論)」,那麼它會很懶。沒有測試過它。 – Automatico

相關問題