2

嘿, 不是Rails noob,但是這讓我很難過。在Rails中有很多直通組織。當我通過葡萄酒單協會(或通過)這種類似的東西將葡萄酒分配到葡萄酒吧。has_many通過吹掉協會關於大衆協會的元數據

class WineBarController 

    def update 

    @winebar = WineBar.find(params[:id]) 

    @winebar.wines = Wine.find(params[:wine_bar][:wine_ids].split(",")) // Mass assign wines. 

    render (@winebar.update_attributes(params[:wine_bar]) ? :update_success : :update_failure) 

    end 

end 

這將刪除與該酒吧相關的每個酒單行。然後它找到wine_ids中的所有葡萄酒,我們認爲這是用逗號分隔的一串葡萄酒ID。然後它將插入到酒單中一個新的關聯。這樣做會很昂貴,但是如果銷燬的關聯行沒有元數據,比如單個酒吧的每個玻璃瓶和瓶子的價格,那就好了。

有沒有辦法讓它不把所有東西都吹走,只是做一個枚舉數組的比較,插入刪除任何改變。我覺得這就是rails所做的事情,我只是想念一些明顯的東西。

謝謝。

回答

2

您的問題看起來像是在更新方法中使用您的第一條語句 - 您正在創建新的酒吧記錄,而不是加載現有記錄並進行更新。這就是爲什麼當你檢查記錄時,沒有任何關係顯示。 Rails 足夠聰明,不會在列表中刪除/創建每個記錄,所以不用擔心。

如果您使用的是表單的標準導軌安裝:

<% form_for @wine_bar do |f| %> 

然後,你可以打電話給你的更新是這樣的:

class WineBarController 
    def update 
    @winebar = WineBar.find(params[:id]) 
    render (@winebar.update_attributes(params[:wine_bar]) ? :update_success : :update_failure) 
    end 
end 

你並不需要顯式地更新你的記錄與params[:wine_bar][:wine_ids],因爲當你用params[:wine_bar]更新它時,wine_ids被包括在內。我希望這有幫助!

更新:您提到過,這不起作用,因爲窗體的設置方式很簡單,但您可以輕鬆修復它。在您的表單中,您需要將輸入字段從wine_bar[wine_ids]重命名爲wine_bar[wine_ids_string]。然後你只需要在你的模型來創建訪問器,像這樣:

class WineBar < ActiveRecord::Base 
    def wine_ids_string 
    wines.map(&:id).join(',') 
    end 

    def wine_ids_string= id_string 
    self.wine_ids = id_string.split(/,/) 
    end 
end 

第一種方法上面是「吸氣劑」 - 它需要相關的葡萄酒ID列表,並將它們轉換爲字符串的形式可以使用。下一個方法是「setter」,它接受逗號分隔的id串,並將其分解到wine_ids=接受的數組中。

您可能還對我的文章Dynamic Form Elements in Rails感興趣,它概述了rails輸入的方式不限於數據庫記錄中的屬性。任何一對訪問器方法都可以使用。

+0

感謝您的回覆,但這不起作用。 wine_ids字段不是嵌套表單。這是一個字符串。我的UI不適合嵌套的表單約定。我更新了我的示例作爲更新。咄。但還需要額外的步驟來查詢葡萄酒ID,然後將它們與酒吧聯繫起來。 – 2010-12-13 17:41:55

+0

嗨勞倫斯 - 我更新了我的答案,讓我知道它是否有幫助。 – 2010-12-13 18:38:24