ruby on rails - tag - Rails has_many: through y collection_select with multiple
rails has_one through (1)
Tengo el problema resuelto. En este caso, el uso de fields_for fue el error. La solución está utilizando un collection_select, como este:
<%= collection_select(:ingredient, :supplier_ids,
Supplier.all(:order=>"name ASC"),
:id, :name, {:selected => @ingredient.supplier_ids, :include_blank => true}, {:multiple => true}) %>
Tengo el siguiente problema al usar un has_many: a través de una relación de muchos a muchos en una selección múltiple a través de collection_select: multiple => true. Tengo proveedores que entregan muchos ingredientes que pueden ser entregados por muchos proveedores. Echar un vistazo:
El modelo de ingredientes:
class Ingredient < ActiveRecord::Base
has_many :ingredient_suppliers
accepts_nested_attributes_for :ingredient_suppliers, :allow_destroy => true
has_many :suppliers, :through => :ingredient_suppliers
end
El modelo del proveedor:
class Supplier < ActiveRecord::Base
has_many :ingredient_suppliers
has_many :ingredients, :through => :ingredient_suppliers
end
La entidad de relación:
class IngredientSupplier < ActiveRecord::Base
belongs_to :ingredient
belongs_to :supplier
end
Y esta es la forma. Tenga en cuenta que no podría hacerlo funcionar sin especificar el: nombre:
<%= form_for(@ingredient) do |f| %>
<%= f.fields_for :suppliers do |supplier_fields| %>
<%= supplier_fields.collection_select (:supplier_ids,
Supplier.all(:order=>"name ASC"),
:id, :name,
{:selected => @ingredient.supplier_ids,
:include_blank => true},
{:multiple => true,
:name => ''ingredient[supplier_ids]''}) %>
<% end %>
<% end %>
Si elimino el: nombre, aparece este mensaje de error:
Supplier(#-617951108) expected, got Array(#-608411888)
Request
Parameters:
{"commit"=>"Anlegen",
"authenticity_token"=>"MuEYtngwThharmM1KaAbH8JD3bScXiDwj0ALMytxl7U=",
"_method"=>"put",
"utf8"=>"✓",
"id"=>"1",
"ingredient"=>{"name"=>"Ingredient 1",
"nr"=>"00100",
"unit"=>"kg",
"mol_per_unit"=>"2000,
00000",
"description"=>"",
"suppliers"=>{"supplier_ids"=>["1",
"2"]}}}
El problema ahora es que los parámetros PUT solo contienen un ID de proveedor en lugar de una matriz de ID de proveedor:
"ingredient"=>{"name"=>"Rohstoff 3", "nr"=>"00300", "unit"=>"Stk.", "mol_per_unit"=>"0,00000", "description"=>"", "supplier_ids"=>"2"}