这应该在模型中吗?如果是这样,我该怎么写呢?

时间:2011-06-13 15:23:14

标签: ruby-on-rails ruby

假设正在编写一个将产品添加到购物车的功能。

我有一个cart.rb模型,方法签名如下:

def self.add_product(store, user, product, quantity, ...)
  # store.id == product.store_id
  # quantity > 0 ?
  # product is active?
  # if product is in cart, update quantity

end

所以我必须传递大约4个其他模型,然后进行一些健全性检查。

因此,如果store.id!= product.store_id,我想返回某种错误或状态,说产品不属于这个商店,所以我无法继续。

如果数量为0,我想告诉用户数量必须是> 0

所有这些逻辑应该在哪里?还有很多其他模型,所以我很困惑。

我应该使用投票错误集吗?或者传回状态代码?

轨道方式是什么?请澄清。

谢谢!

2 个答案:

答案 0 :(得分:5)

要详细说明上面的评论,以下是CartCartItem课程的外观/工作方式。

class Cart < ActiveRecord::Base
  has_many    :items, :class_name => 'CartItem'
  belongs_to  :user   # one user per cart 
  belongs_to  :store  # and one store per cart 
end

class CartItem < ActiveRecord::Base
  belongs_to :cart
  belongs_to :product

  validates_presence_of :cart, :product

  # sanity check on quantity
  validates_numericality_of :quantity,  :greater_than => 0,
                                        :only_integer => true

  # custom validation, defined below
  validate :product_must_belong_to_store

  protected
  def product_must_belong_to_store
    unless product.store_id == cart.store_id
      errors.add "Invalid product for this store!"
    end
  end
end

# Usage:

# creating a new cart
cart = Cart.create :store => some_store, :user => some_user

# adding an item to the cart (since `cart` already knows the store and user
# we don't have to provide them here)
cart_item = cart.items.create :product => some_product, :quantity => 10

答案 1 :(得分:0)

我认为这应该被称为cart_item.rb,而您在add_product中所做的事情应该在cart_controller#create行动中完成。

为了检查值,我认为您应该查看自定义validators