2013-12-21 3 views
1

through 옵션을 사용하여 조인 모델과 함께 has_many를 사용하여 서로 관련이있는 두 개의 모델이 있습니다.ActiveRecord has_many through through with higher preendence

두 클래스 B 및 C에 대한 테이블에는 각각 순위 열이 있습니다. C의 순위는 글로벌 순위이며, 피봇 테이블 (B)의 순위는 글로벌 순위가있는 경우이를 대체하는 순위입니다.

문제는 ActiveRecord가 두 테이블의 순위 열을 ORDER BY 절에 추가하는 경우이 경우 반대 순서로 추가하는 것입니다. 예를 들어, 다음의 코드는 :

A.find(1).c 

협회의 순서 속성에 우선 고려되어야 나타나는 C 클래스에

SELECT c.* FROM c INNER JOIN b ON c.id=b.c_id WHERE b.a_id = 1 ORDER BY c.rank, b.rank 

default_scope를 생성한다. 나는 C 클래스의 기본 스코프를 제거 할 수 없다. 앱 전체의 다른 기능이 그것의 영향을받을 것이기 때문이다.

주어진 관계에 대해이 동작을 변경하는 방법이 있습니까?

+2

http://rails-bestpractices.com/posts/806-default_scope-is-evil – fey

+0

@fey가 나에게 이길 수 있습니다. 비슷한 문제가 발생했습니다. 기본 범위보다는 쿼리에서 순서를 지정하는 것이 최선의 방법입니다. 기본 범위는 응용 프로그램에서 너무 많은 메커니즘을 멀리 숨 깁니다. – Gene

+0

게시물에 대한 링크를 제공해 주셔서 감사 드리며 확실히 동의합니다. 그러나,이 경우 불행히도 default_scope를 추가하지 않았습니다. 난 그 응용 프로그램을 통해 빗질하고 그 default_scope의 동작을 기대하는 코드의 모든 비트를 업데이 트하거나, 적어도 나중에 그 리팩토링을 저장하지 않기를 바랬습니다. –

답변

2

범위를 정의하고 명시 적으로 호출하는 것이 가장 좋습니다.

+0

나는 기본 범위를 사용하여 모든 코드를 리팩터링 할 수있을 때까지 잠시 동안 해결을 기대하고 있었다. –