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