订购与第二模型相关的第一模型

时间:2009-09-09 19:52:45

标签: ruby-on-rails sorting many-to-many

我正在使用RoR开展我的第一个项目,我需要在两个模型之间创建多对多的关系,但是可以将第一个模型的对象与第二个模型相关联。

假设我有两个以下型号 - 客户 - 路线

我希望将许多客户分配到多个路由,但是存储此关联的存储顺序,例如

-Route 1
--Customer 2, position 1
--Customer 1, position 2

-Route 2
--Customer 3, position 1
--Customer 1, position 2

我想我必须使用has_many:through和belongs_to并在中间表中创建“position”字段,但是如何使这个字段可以访问和编辑?

4 个答案:

答案 0 :(得分:3)

您可以使用:through

class Route < ActiveRecord::Base
  has_many :bookings
  has_many :routes, :through => bookings
end

class Booking < ActiveRecord::Base
  belongs_to :route
  belongs_to :customer
end

class Customer < ActiveRecord::Base
  has_many :bookings
  has_many :routes, through => :bookings
end

您的预订模式会保留日期/位置,您可以通过以下方式访问它们:

c = Customer.first
c.routes(:include => :bookings, :order => "bookings.position")

答案 1 :(得分:1)

class Customer < ActiveRecord::Base
  has_many :routes, :through => :trips
  ...
end

class Trip < ActiveRecord::Base
  belongs_to :customer
  belongs_to :route
  // has a ordinal called 'seq'
  ...
end

class Route < ActiveRecord::Base
  has_many :customers, :through => :trips
  ...
end

您应该可以通过@ customer.routes [0] .seq访问序号字段 我没有测试过它,我的导轨技能很长时间,但是你应该明白这一点。

答案 2 :(得分:0)

引用的解决方案是正确的。要访问中间表,请尝试:

c.bookings # this will return the 'middle table' which then you have the access to the positions 
c.bookings.first.position

答案 3 :(得分:0)

我想将所有客户分配显示到一个路由,因此发送到数据库的查询是:

SELECT customers。* FROM customers INNER JOIN bookings ON customers。id = bookings .customer_id WHERE((bookings。route_id = 1))

然后

SELECT bookings。* FROM bookings WHERE(bookings .customer_id IN(1,2,3))

..所以,第二个查询在WHERE calus中不包含enought信息,因为它为特定客户选择了所有路由的信息,而不仅仅是针对特定路由的特定客户(id = 1)。

..是否在获取此数据后进行了一些额外的过滤?

顺便说一句。我有:include =&gt; :预订添加到路线模型