RoR:“belongs_to_many”?协会头痛

时间:2009-11-13 23:03:14

标签: ruby-on-rails activerecord logic associations

我似乎无法绕过这个,所以我想我会发帖,看看是否有人可以帮助我(请原谅这个问题,如果它的侮辱性很简单:现在对我来说很复杂!)

我有这些模特:

order
service
customer

我认为他们说话自己:servicecustomer在放置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键中只有一个值字段 - 目前不存在 - 将它绑定到一个订单,它需要能够属于许多订单。)

我在这里缺少什么?

4 个答案:

答案 0 :(得分:1)

class Customer
   has_many :orders
end

class Service
   has_many :orders
end

class Order
   belongs_to :customer
   belongs_to :service
end

订单应该有customer_idservice_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_manyhas_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,因为在需要发送实际产品而不是服务的系统中,您可能有将订单链接到库存的分配,这些分配将包含获得分配的行项目和货件产品到客户端,也有订单项。因此,订单项术语可能会变得非常重载。在您的模型中可能不是这种情况,因为您只是在做服务。