gpt4 book ai didi

ruby-on-rails - accepts_nested_attributes_for 链接到现有记录,而不是创建新记录

转载 作者:行者123 更新时间:2023-12-03 20:17:14 24 4
gpt4 key购买 nike

我有以下型号

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

现在我有一个订单 View ,我想在其中更新产品的商店。
问题是我只想将产品连接到我数据库中的现有商店,而不是创建新商店。

我在订单 View 中的表单如下所示(使用 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 的解决方案更优雅,应该比我的更受欢迎。

最佳答案

尝试实现 :reject_if检查 Store 是否已经存在,然后使用它:

class Product < AR::Base
belongs_to :order
has_and_belongs_to_many :stores

accepts_nested_attributes_for :stores, :reject_if => :check_store

protected

def check_store(store_attr)
if _store = Store.find(store_attr['id'])
self.store = _store
return true
end
return false
end
end

我有这个代码在当前项目中工作正常。

请让我知道您是否找到了更好的解决方案。

关于ruby-on-rails - accepts_nested_attributes_for 链接到现有记录,而不是创建新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4164185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com