0

我在解决 Rails 4 中处理订单的常见问题时遇到了困难。我有一个模型对象“Offers”,然后被用户接受。这个动作“accept”需要创建一个新的 Order 对象,它保存与 Offer 对象相同的属性。根据我阅读的内容,我的代码应如下所示:

class User
  has_many :offers
  has_many :orders, through :offers
  # ...
end

class Offer
  belongs_to :user, dependent: :destroy
  has_one: order
  # ...
end

class Order
  belongs_to :offer

  def add_fields_from_offer(order)
    order.offer.each do |offer|
      offer_id = nil
      order << offer
    end
  end      
end

我将不胜感激有关此代码或此方法结构的任何建议。Offer 对象实际上是交易产品,因此一旦被接受就应该销毁它。但我希望将订单保存为用户帐户历史记录的对象。

这本质上意味着重复相同的字段,但使用不同的模型——这是一个好方法还是有更好的方法?

非常感谢

4

2 回答 2

1

您可以Offer完全放弃该模型,并acceptedis_offer您的Order.

于 2013-09-04T22:16:43.463 回答
0

经过一些进一步的研究,我发现只使用一个模型(这里是“优惠”)并使用 state_machine gem 来获得帮助会更容易。如果您的产品经历了几个阶段,例如接受、发布等,这是理想的选择。

该文档解释了如何在模型中实现这一点,例如

state_machine :initial => :new do
          event :accept do
    transition :from => :new, :to => :accepted, :unless => :expired?
  end
于 2013-09-07T18:46:57.910 回答