我有以下型號accepts_nested_attributes_for就鏈接到現有記錄,而不是創建一個新的
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
現在我有一個順序圖,其中我想更新該產品的商店。 問題是我只想將產品連接到我的數據庫中的現有商店,而不是創建新的商店。
我在訂單視圖形式如下(使用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)
雖然它的嵌套它工作正常。 問題是,當我選擇商店並嘗試更新訂單(以及產品和商店)時,Rails嘗試使用該名稱創建新商店。我希望它只使用現有的商店並將產品連接到該商店。
任何幫助表示讚賞!
編輯1:
在我以一種非常粗暴的方式解決了這個問題到底:
# 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
編輯2:
Pablo的解決方案更優雅,應該優先於雷。
審查a_n_a_f(http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html)我第一次興奮,當我看到update_only選項,但很快就意識到了文檔後,有沒有辦法做我想做的事(update_only在創建新對象之前更新現有對象)。 – 2010-11-23 20:13:42