我似乎无法绕过这个,所以我想我会发帖,看看是否有人可以帮助我(请原谅这个问题,如果它的侮辱性很简单:现在对我来说很复杂!)
我有这些模特:
order
service
customer
我认为他们说话自己:service
是customer
在放置order
时购买的内容。
确定。
所以,当然,我设置了这些关系:
# a customer can have many orders
class Customer
has_many :orders
end
# an order belongs to a single customer and can have many services
class Order
belongs_to :customer
has_many :services
end
...但是这里是我绊倒的地方:
# a service can belong to many orders
class Service
# belongs_to :order ???
end
因为我对belongs_to
的理解是 - 如果我把它放在那里 - 服务只能属于一个order
(它在order_id
键中只有一个值字段 - 目前不存在 - 将它绑定到一个订单,它需要能够属于许多订单。)
我在这里缺少什么?
答案 0 :(得分:1)
class Customer
has_many :orders
end
class Service
has_many :orders
end
class Order
belongs_to :customer
belongs_to :service
end
订单应该有customer_id
和service_id
,因为它与两者都存在多对一的关系。
答案 1 :(得分:1)
有两种方法可以解决这个问题。第一个是铁轨管理的多对多关系。在这种情况下,您在订单和服务模型中使用“has_and_belongs_to_many”关系。 Rails将自动创建一个管理关系的连接表。关系看起来像这样:
class Order
has_and_belongs_to_many :services
end
class Service
has_and_belongs_to_many :orders
end
第二种方法是通过中间模型自己管理连接表。在这种情况下,您可能有另一个名为“LineItem”的模型,它在订单的上下文中表示服务。关系看起来像这样:
class LineItem
belongs_to :order
belongs_to :service
end
class Order
has_many :line_items
end
class Service
has_many :line_items
end
我更喜欢第二个自己。这可能只是我,但我并不会对它明确时发生的事情感到困惑。另外,如果我想为关系本身添加一些属性(比如你的情况下可能是数量),我已经准备好了。
答案 2 :(得分:1)
我认为this Railscast会帮助你 - 基本上你有两个选择。您可以使用has_and_belongs_to_many
或has_many :through
。
您还会发现has_and_belongs_to_many
已被弃用,而has_many :though => model_name
提供相同(更多)的功能。
答案 3 :(得分:0)
我认为您已经意识到这一点,但您的订单实际上是一个复合域模型,有时在DDD中称为聚合。
您的服务实际上是某人可以订购的某些产品/服务的列表。您的订单汇总记录了某人的订单。
其他人所说的汇总是由一个标题组成的订单,其中包括订购的日期,日期,是否包含税金,运费等等。订单包含了多个OrderLineItem。 OrderLineItem belongs_to Service,包含订购数量,belongs_to产品/服务等内容。
class Customer<的ActiveRecord :: Base的 has_many:订单 结束
class Order<的ActiveRecord :: Base的 belongs_to:客户 端
class OrderLineItem<的ActiveRecord :: Base的 belongs_to:订单 端
我个人使用OrderLineItem模型名称来引用LineItem,因为在需要发送实际产品而不是服务的系统中,您可能有将订单链接到库存的分配,这些分配将包含获得分配的行项目和货件产品到客户端,也有订单项。因此,订单项术语可能会变得非常重载。在您的模型中可能不是这种情况,因为您只是在做服务。