2009-10-01 64 views
2

我有一個人模型和一個報價模型。每個人都可以有許多與他們相關的引用,而這些引用又有與作者,文本,Url相關的內容。在實踐中,實際上只有一個人有報價對象,但所有人都可能有一個。批量更新使用導軌中的對象的對象

我正試圖在報價上使用一個簡單的散裝適度工具。如在中,用戶可以輸入引號和管理員可以去並且具有特定人員的所有引號(但是實際上,只有一個人會擁有他們)並且檢查將布爾批准設置爲0或1的框。當引號實際上被顯示,它們被該字段過濾。

我越來越混淆,試圖創建一個表單,批量更新這些。我得到的形式顯示所有的人都像這樣:

<% form_for :quotes, :html => { :method => :put }, :url => {:controller => "quote", :action => "bulk_update", } do |quote_form| %> 
    <% @person.quotes.each do |quote| %> 
<p> 
    <% fields_for "quotes[id][]", quote do |fields| %> 
      Text.... 
      <%= fields.check_box :approved %><br><br> 

    <% end %> 
</p> 

<% end %> 
<%= submit_tag 'Update' %> 
<% end %> 

我只是在我的批量更新控制器一個令人難以置信的通用的東西基本上是像一個正常的更新控制器。我不知道該放什麼。我可以嘗試把所有我可能應該引用的引號,但是我不知道怎麼去那個變量,因爲我在Person視圖等等中做了所有這些。控制器是這樣的:類似於:

def bulk_update 
@quote = Quote.find(params[:id]) 
end 

我想我對於應該在那裏的ID和應該通過什麼的ID感到困惑。應該把個人ID作爲這個的一部分嗎?就像我所說的,我並不在意技術上所有引號是否顯示在該頁面上,他們不需要按用戶排序。

我得到看起來像這樣的參數:

「引號」=> { 「ID」=> { 「6」=> { 「批准」=> 「0」},..

但它抱怨沒有ID沒有找到報價。我不關心ID,因爲我想批量更新所有這些ID。看起來這個特定的結構會映射幾個ID,但也許(可能)我必須改變我的控制器來彌補這一點,但不知道如何。當我嘗試刪除哈希引號時,它也不起作用,只是將「id」=> {「6」=> {「approved」=>「0」}作爲我的參數。

編輯:我發現了一個名爲update_all聲明,但我不知道該如何選擇地通過它我需要什麼...

回答

4

我發現下面的方法要靈活專門爲錯誤處理,以及:

def bulk_update 
    quotes = params["quotes"]["id"] 
    quotes.each do |quote_id,quote_attrs| 
    quote = Quote.find(quote_id) 
    quote.update_attributes(quote_attrs) 
    # Other logic of interest like error handling 
    # . . . 
    end 
    # Don't forget to render or redirect to the proper view 
end 

更新

做到這一點,正確的方法是通過更新邏輯移動到模型:

class QuotesController < ApplicationController 
    def bulk_update 
    errors = Quote.bulk_update(params["quotes"]["id"]) 
    # Other logic of interest like error handling 
    # . . . 
    # Don't forget to render or redirect to the proper view 
    end 
end 

class Quote < ActiveRecord::Base 
    def bulk_update 
    errors = {} 
    quotes.each do |quote_id,quote_attrs| 
     quote = Quote.find(quote_id) 
     unless quote.update_attributes(quote_attrs) 
     errors[quote_id] = qoute.errors 
     end 
    end 
    errors 
    end 
end 
+0

我得到一個零對象當我嘗試像這樣運行它時引號。另外,我的參數散列應該是什麼樣子?什麼變化: 「quotes」=> {「id」=> {「6」=> {「approved」=>「0」},.. – 2009-10-02 19:05:01

+0

更新以匹配您的結構,但如果沒有,請提交2個引號並將結果結構粘貼到params散列表中。 – khelll 2009-10-02 20:27:11

+1

我認爲你應該重寫person.update並在那裏做,這個東西在控制器中沒有業務。 – nasmorn 2009-10-02 20:32:20

0

我會做這樣的事情:

def self.bulk_update(attributes) 
    where(id: attributes.keys).each_with_object({}) do |quote, errors| 
    unless quote.update_attributes(attributes["#{quote.id}"])} 
    errors["#{quote.id}"] = entry.errors 
    end 
end 

在這種方法中,你會只加載關注引號。 -

格雷戈裏Horion

0

看着這個代碼後:

def bulk_update 
    quotes = params["quotes"]["id"] 
    quotes.each do |quote_id,quote_attrs| 
    quote = Quote.find(quote_id) 
    quote.update_attributes(quote_attrs) 
    end 
end 

我想這可能是更簡潔做到這本:

Quote.where(:condition => "value").collect{|x| x.update_attributes(quote_attrs)}