j'ai les modèles suivantsaccepts_nested_attributes_for pour créer un lien vers enregistrement existant, créer un nouveau pas
class Order < AR::Base
has_many :products
accepts_nested_attributes_for :products
end
class Product < AR::Base
belongs_to :order
has_and_belongs_to_many :stores
accepts_nested_attributes_for :stores
end
class Store < AR::Base
has_and_belongs_to_many :products
end
Maintenant, j'ai une vue de l'ordre là où je veux mettre à jour les magasins pour le produit. La chose est que je veux seulement connecter les produits aux magasins existants dans mon DB, pas en créer de nouveaux.
Ma forme dans la vue de la commande ressemble à ceci (en utilisant Formtastic):
= semantic_form_for @order do |f|
= f.inputs :for => :live_products do |live_products_form|
= live_products_form.inputs :for => :stores do |stores_form|
= stores_form.input :name, :as => :select, :collection => Store.all.map(&:name)
Bien que son imbriquée il fonctionne très bien. Le problème est que, lorsque je sélectionne un magasin et essaie de mettre à jour la commande (et les produits et magasins avec elle), Rails essaie de créer un nouveau magasin avec ce nom. Je veux juste utiliser le magasin existant et connecter le produit à cela.
Toute aide appréciée!
EDIT 1:
En fin de compte, je résolu ce problème d'une manière très grossière:
# ProductsController
def update
[...]
# Filter out stores
stores_attributes = params[:product].delete(:stores_attributes)
@product.attributes = params[:product]
if stores_attributes.present?
# Set stores
@product.stores = stores_attributes.map do |store_attributes|
# This will raise RecordNotFound exception if a store with that name doesn't exist
Store.find_by_name!(store_attributes[:name])
end
end
@order.save
[...]
end
EDIT 2:
solution de Pablo est beaucoup plus élégant et doit être préféré à moi .
Après avoir examiné les documents pour a_n_a_f (http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html) Je suis arrivé excité quand j'ai vu l'option update_only mais rapidement réalisé est impossible faire ce que je veux faire (update_only met à jour les objets existants avant d'en créer de nouveaux). –