我有一个 Model Product,在创建的过程中会做各种操作,我使用 services,而不使用 Model 的 Concern,这对吗?
假设情况是这样的,我有 Model Order
, Product
, Store
。没创建一个Product
,库存Store
就要发生变化,Order
也要进行 Update。其实实际情况要更复杂一些,简单的描述就是:
Controller
def create
@product = Product.new(product_params)
if @product.save_and_setting_all
puts @product
else
puts @product.errors
end
end
Model
def save_and_setting_all
begin
ActiveRecord::Base.transaction do
@product.save!
@product.order.update!(...)
@product.store.update!(...)
end
rescue Exception => e
false
end
end
但是我觉得使用 services 更符合逻辑: Services
Class ProductAssistant
attr_reader :product
def initialize(params)
@params = params
end
def save
begin
ActiveRecord::Base.transaction do
@product.create!(@params)
@product.order.update!(...)
@product.store.update!(...)
end
rescue Exception => e
false
end
end
def errors
@product.errors
end
end
Controller 就改为:
def create
@product = ProductAssistant.new(product_params)
if @product.save
puts @product
else
puts @product.errors
end
end
我个人觉得这样会更加的优雅。不知道我这样做合适吗?
这里有一个这样的问题,目前我还不知道怎么解决,请可以帮我看看吗?
就是在使用Services
的 Controller 里,@product.save
了之后,我puts @product
里的@product就不属于Product
Model 了,所以在 view 里的@product.name
之类的就会出错了。不知道这个用什么办法赋值比较好呢?
我刚刚想到一个方法,在 Services 里:
def save
begin
ActiveRecord::Base.transaction do
@product.create!(@params)
@product.order.update!(...)
@product.store.update!(...)
end
self = @product #新增
rescue Exception => e
false
end
end
结果不可以对 self 赋值,会报错。所以目前真想不到什么好办法了。