将join_attributes用于has_many:through with join table on join table

时间:2011-08-01 17:44:59

标签: ruby-on-rails ruby-on-rails-3

我有2个型号的产品和字体。产品“has_many:fonts,:through =>:product_available_fonts”。

我有一个javascript / jQuery用户界面正在创建一个表单来传递给rails以更新这些关联。在UI中,您可以在配置期间将现有字体添加到产品。您还可以重新排列字体的顺序。此订单存储为ProductAvailableFont对象中的字段“order”,该对象连接Product和Font表。 目前,字体通过以下方式添加:

params[:product][:font_ids] = ["1","2","4"…]

@product.update_attributes(params[:product])

在控制器中。订单通过

更新
params[:product][:product_available_font_attributes] = [
  {"id"=>"1", "order"=>"2"},
  {"id"=>"2", "order"=>"1"}
]

问题是,在创建表单时,对于刚刚添加到产品的Font,没有ProductAvailableFont对象。当我没有ID时,如何定义其订单属性?

2 个答案:

答案 0 :(得分:1)

首先,我建议将连接表的名称更改为products_fonts(两个单词都复数并保留“可用”)。如果我理解正确,它有一个product_id,font_id和order字段(它是你自己永远不应该使用的id)。

当您的用户向产品添加字体时(假设字体已存在),您的表单/ javascript / client应该使用嵌套的fonts_products属性向服务器发送新的订单对象。如果你已经正确配置了模型关系,Rails应该在服务器端自动处理这个问题。

要获得正确的POST请求,大多数魔法都是由rails的表单构建器完成的。你想用javascript重现吗?这可能很棘手。

答案 1 :(得分:0)

对于遇到此问题的任何人,在我们的代码中解决此问题的结论是仅对所有已知代码使用product[product_available_font_attributes][id][],然后对所有已知代码使用product[product_available_font_attributes][font_id][],然后{{1}要添加的所有字体。您必须确保在id元素后面的表单中的所有现有对象都有font_id元素,并且按顺序,否则rails会将它们混合起来。