Rails路由更新关联模型的属性

时间:2016-02-15 19:07:14

标签: ruby-on-rails

我有CartCartProductProduct模型。每当产品添加到购物车时,代表购物车中商品的CartProduct模型都会有相应更新的属性quantity。目前,我在PATCH发送Cart次请求,以更新Cart相关的CartProduct模型。

我的问题是:当我想更新购物车项目时,在{{1}中使用add_productremove_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模型上设置路由/方法更有意义,因为这是更新的实际模型。

2 个答案:

答案 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

在许多情况下,使用嵌套属性和创建/更新/删除子记录是一个很好的解决方案 - 但它往往会导致创建一个非常有限的操作设置的诱惑。