我正在使用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”字段,但是如何使这个字段可以访问和编辑?
答案 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; :预订添加到路线模型