我有Cart
,CartProduct
和Product
模型。每当产品添加到购物车时,代表购物车中商品的CartProduct
模型都会有相应更新的属性quantity
。目前,我在PATCH
发送Cart
次请求,以更新Cart
相关的CartProduct
模型。
我的问题是:当我想更新购物车项目时,在{{1}中使用add_product
,remove_product
等方法会更好吗?模型,或者我应该在CartProduct
模型中使用这些方法(我目前的设置如下,哪个功能正常)?或者这取决于个人喜好?
请注意,代码不完整;我刚刚找到了这个问题的重要部分:
Cart
当用户增加购物车项目的数量时,实际更新的是class Cart < ActiveRecord::Base
has_many :cart_products, inverse_of: :cart, dependent: :destroy
has_many :products, through: :cart_products, source: :product
def add_product(product_id) #directed here from PATCH request
#pulls the associated cart_product for this cart and updates
end
def remove_product(product_id) #directed here from PATCH request
end
end
class CartProduct < ActiveRecord::Base
belongs_to :cart, inverse_of: :cart_products
belongs_to :product, inverse_of: :cart_products
#or should add_product, remove_product methods go here instead?
end
class Product < ActiveRecord::Base
has_many :cart_products, inverse_of: :product, dependent: :destroy
has_many :carts, through: :cart_products, source: :cart
end
模型,而不是CartProduct
模型 - 所以这让我担心,因为我&#39;我在Cart
上发送PATCH
请求,而我认为在Cart
模型上设置路由/方法更有意义,因为这是更新的实际模型。
答案 0 :(得分:1)
我认为你提出的问题将取决于个人喜好。
我的偏好是保持原样,并从add_product
模型中调用Cart
。
其他人可能会建议创建一个全新的类,观察者等来处理两个模型之间的关系,但是你最终要做的是创建一个依赖于两个模型的类而不是保留你拥有的只有一个模型方法依赖于另一个模型的属性。
答案 1 :(得分:0)
您混合了MVC中的控制器和模型。
模型是您在应用程序中实现业务逻辑的方式,以及不同对象如何捆绑在一起。模型不应该知道关于PUT,POST,PATCH的任何信息,甚至不知道有当前请求,这不是他们的工作。
因此,如果您在模型中创建一个方法来处理特定类型的请求而不是您做错了。
控制器负责响应请求。与路由一起构建您的应用程序公开的RESTful接口。
如何处理嵌套资源就像在这种情况下是一个意见问题。
为了清晰起见,我将使用更常见的术语订单项而不是CartProduct:
Prefix Verb URI Pattern Controller#Action
products GET /products(.:format) products#index
POST /products(.:format) products#create
product GET /products/:id(.:format) products#show
PATCH /products/:id(.:format) products#update
PUT /products/:id(.:format) products#update
DELETE /products/:id(.:format) products#destroy
cart_line_items GET /carts/:cart_id/line_items(.:format) line_items#index
POST /carts/:cart_id/line_items(.:format) line_items#create
line_item GET /line_items/:id(.:format) line_items#show
PATCH /line_items/:id(.:format) line_items#update
PUT /line_items/:id(.:format) line_items#update
DELETE /line_items/:id(.:format) line_items#destroy
carts GET /carts(.:format) carts#index
POST /carts(.:format) carts#create
cart GET /carts/:id(.:format) carts#show
PATCH /carts/:id(.:format) carts#update
PUT /carts/:id(.:format) carts#update
DELETE /carts/:id(.:format) carts#destroy
在许多情况下,使用嵌套属性和创建/更新/删除子记录是一个很好的解决方案 - 但它往往会导致创建一个非常有限的操作设置的诱惑。