簡體   English   中英

Rails路線來更新關聯模型的屬性

[英]Rails route to update an associated model's attributes

我有一個CartCartProductProduct模型。 每當將產品添加到購物CartProduct ,代表購物車中商品的CartProduct模型都會具有相應的屬性quantity 當前,我正在Cart上發送PATCH請求,以更新Cart的關聯CartProduct模型。

我的問題是:當我想更新購物車商品時,最好在CartProduct模型中使用add_productremove_product等方法,還是應該在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模型,而不是Cart模型-因此這讓我感到擔心,因為我在Cart上發送了PATCH請求,而我認為這樣做更有意義在CartProduct模型上具有路線/方法,因為這是要更新的實際模型。

我認為您的要求將取決於個人喜好。

我的喜好是將其保留為您所擁有的名稱,然后從Cart模型中調用add_product

其他人可能建議創建一個全新的類,觀察者等來處理這兩個模型之間的關系,但是您最終要做的是使一個類依賴於兩個模型,而不是保留您擁有的類而僅使一個模型方法依賴另一個模型的屬性。

您混合了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

在許多情況下,使用嵌套屬性和創建/更新/刪除子記錄是一個很好的解決方案-但它常常導致創建非常有限的動作集的誘惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM