2009-09-09 5 views
2

저는 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 그리고 creat "position"필드를 in-middle-table에 넣어야하지만이 필드를 접근 가능하고 편집 가능하게 만드는 방법은 무엇인가?

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 

귀하의 예약 모델은 날짜/위치를 유지하는 것입니다 그리고 당신은 그들에 액세스 할 수 있습니다 :

답변

3

당신은 :through으로 갈 수

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

어떻게이 위치 필드에서 어떻게 작동합니까? 고객에게도 할당 할 수 있습니까? 주어진 예약 – Inez

+0

: C = Customer.first B = c.bookings.first b.position 그러나 이미 위의 코드가 순서대로 경로를 반환합니다, 당신은 단지 부분 (이상 루프를 전달할 수 컨트롤러에서 결과 집합). – cite

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 

당신은에 액세스 할 수 있어야합니다 ordinal field @ customer.routes [0] .seq 나는 그것을 테스트하지 않았고 나의 레일 스킬은 길지 않았다. 그러나 당신은 아이디어를 얻어야한다.

0

인용 해의 해결책이 맞습니다.

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

내가 한 경로로 모든 고객의 assignes를 표시하려면, 그래서 데이터베이스로 전송 쿼리는 다음과 같습니다 : 중간 테이블에 액세스 시도

customers을 SELECT * customers FROM INNER가 customers ON bookings 가입하세요.. 식 bookings .customer_id WHERE ((bookings .route_id = 1))

하고

bookings를 선택한다. * FROM bookings WHERE (bookings. 고객 번호 IN (1,2,3))

.. 두 번째 쿼리에는 특정 고객에 대한 모든 경로에 대한 정보를 선택하기 때문에 WHERE 칼러스에 충분한 정보가 포함되어 있지 않습니다. 특정 경로의 고객 (id = 1).

.. RoR이 데이터를 가져온 후 추가 필터링을하고 있습니까?

btw. 내가 가지고있는 : 포함 => : 국경 모델에 예약 추가

+0

하지만 첫 번째 쿼리가 올바르게 작동합니까? 두 번째 쿼리에서는 모든 예약을 미리로드하는 추가 쿼리를 쿼리합니다. 왜냐하면 Route 모델에 'inlcude'가 있기 때문입니다. 'Include'는 장래 필요할 경우를 대비하여 첫 번째 쿼리와 관련된 모든 예약을로드하도록 레일에 지시합니다. –

+0

예. 그렇지만 특정 고객과 해당 사용자 및 해당 경로와 관련된 예약의 특정 레코드 사이에는 연관이 없으므로 위치를 알 수 없습니다. – Inez

관련 문제