假设正在编写一个将产品添加到购物车的功能。
我有一个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
等
所有这些逻辑应该在哪里?还有很多其他模型,所以我很困惑。
我应该使用投票错误集吗?或者传回状态代码?
轨道方式是什么?请澄清。
谢谢!
答案 0 :(得分:5)
要详细说明上面的评论,以下是Cart
和CartItem
课程的外观/工作方式。
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