电子商务-Rails 3购物车设计问题



我有一个Transactions对象(作为购物车的一部分),它属于另外两个对象,Products和Services。"产品"one_answers"服务"都与"事务"嵌套,以创建/Products/1/Transactions/new和/Services/1/transitions/new等URL。并且,表单是使用form_for[@product,@transaction]do|f|type格式创建的。注意:产品和服务在设计和功能上差异太大,无法将它们组合成STI类型的单个对象。

我的问题是:没有STI,还有更好的方法吗?那么,检查控制器以确定要操作的对象类型的最佳方法是什么?

IE在新的行动:

if ???
  @product = Product.find(params[:product_id])
  @transaction = @product.transactions.build
elsif ???
  @service = Service.find(params[:service_id])
  @transaction = @service.transactions.build
end

与此相关的是,有人知道任何讨论Rails3购物车设计的教程吗?我在书中见过一些,但它们使用会话来存储整个购物车对象,在我看来,这不是很安全。还有一些过于简单化了。

如有任何帮助,我们将不胜感激!

我认为这里有两个基本选项。

(1) 创建两种事务类型/模型:product_transactions和service_transactions。两者都可以从公共事务模块继承。这种方法允许您忽略"我在处理哪种事务?"这一问题,并专注于事务模块中的常见实现细节。然后可以维护两个更简单的嵌套控制器,/products/<id>/transactions/services/<id>/transactions,它们不需要类型检查。

(2) 将类型检查移动到通用事务模型中。这种方法假设交易和产品或服务之间的交互将通过交易模块来处理,因此您不需要负责知道与哪个模块交互。例如:

class Transaction
  belongs_to :service
  belongs_to :product
  def parent
    @parent ||= product || service
  end
  def call_some_action_on_parent
    parent.some_action
  end
end

您可以在控制器中执行类似操作:

@parent = params[:service_id].blank? ? Product.find(params[:product_id]) : Service.find(params[:service_id])
@transaction = @parent.transactions.build(params[:transaction])

您确定的选项实际上应该是基于您对交易对象的需求做出的决定。如果有很多自定义代码,这取决于你是否与产品或服务交互,你应该遵循第一种方法。如果代码本质上是相同的,你应该采取第二种方法,专注于事务与其父对象(产品、服务或其他)之间的契约,而忽略对象类型。本质上,你真正感兴趣的只是父对象是否响应特定方法,而不是它实际上是什么样的对象,避免类型检查并将重点放在respons_to上?方法。

相关内容

  • 没有找到相关文章

最新更新