【问题标题】:Cart validations for maximum items最多商品的购物车验证
【发布时间】:2016-01-26 11:20:52
【问题描述】:

我有 2 个模型,cart 和 line_item:

cart.rb & line_item.rb

class Cart < ActiveRecord::Base
  has_many :line_items, dependent: :destroy
  belongs_to :user

class LineItem < ActiveRecord::Base
 belongs_to :cart
 belongs_to :user

application_controller.rb

def current_cart
    Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound
    cart = current_user.cart.create
    session[:cart_id] = cart.id
    cart
end

如何将验证添加到我的购物车,以便用户最多只能将 5 件商品添加到他们的购物车中?目前我有这个代码,但它不工作?

def maximum_items_not_more_than_5
    if line_items.count > 5
      errors.add(:line_items, "must be less than 5")
    end
end

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    这是一种方法,我会尝试:

    class LineItem < ActiveRecord::Base
     belongs_to :cart, validate: true # enables validation
    

    然后在 Cart 模型中,编写您自己的自定义验证,例如:

    class Cart < ActiveRecord::Base
      has_many :line_items, dependent: :destroy
      validate :maximum_items_not_more_than_5 # using custom validation
    
      private
    
      def maximum_items_not_more_than_5
        if line_items.count > 5
          errors.add(:base, "must be less than 5")
        end
      end
    

    【讨论】:

    • 奥雅纳再次出击。先生,您在 Rails 方面取得了惊人的进步!
    【解决方案2】:

    为什么line_item属于user??肯定是item:

    #app/models/user.rb
    class User < ActiveRecord::Base
       has_many :carts
    end
    
    #app/models/cart.rb
    class Cart < ActiveRecord::Base
       belongs_to :user
    
       has_many :line_items, inverse_of: :cart
       has_many :items, through: :line_items
    
       validate :max_line_items
    
       private
    
       def max_line_items
          errors.add(:tags, "Too many items in your cart!!!!!!") if line_items.size > 5
       end
    end
    
    #app/models/line_item.rb
    class LineItem < ActiveRecord::Base
       belongs_to :cart, inverse_of: :line_items
       belongs_to :item #-> surely you want to specify which item is in the cart?
    end
    
    #app/models/item.rb
    class Item < ActiveRecord::Base
       has_many :line_items
       has_many :carts, through: :line_items
    end
    

    验证

    这肯定是在validation 的领域,特别是custom method

    #app/models/model.rb
    class Model < ActiveRecord::Base
       validate :method
    
       private
    
       def method
           ## has access to all the instance attributes
       end
    end
    

    我也将inverse_of 加入其中。

    您可以在此处查看其工作原理:https://stackoverflow.com/a/20283759/1143732

    具体来说,它允许您从特定模型调用 parent / child 对象,从而允许您调用驻留在这些文件中的验证和方法。

    在您的情况下,可能line_item 模型添加验证是谨慎的——指定单个数量或其他内容。您可以通过设置正确的 inverse_of 直接从您的 cart 模型调用此模型中的验证

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 2015-06-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多