2


독립적 인 액티브 쿼리

class User < ActiveRecord::Base 
    def self.all_users_count 
    User.all 
    end 
end 

User.all_users_count
반환, 예를 들어, 100

User.limit(5).all_users_count
지금은 를 반환 레일 코드에 대한 몇 가지 루비있다 5 때문에 ActiveRecord :: 관계 컨텍스트 때문에, 내가 wroute 이름에도 불구하고 클래스 대신 간단한 User.allall
전 모델 방법 내부 상황에 독립적 인 AR 쿼리를 만들 수있는 방법, 그래서

(해당 쿼리가 항상 다른 경우 limit 또는 where id 또는 다른 일을 포함 보여 .to_sql)? User.all 님 외

감사합니다.

ps. 아니면 내 코드에이 같은 오류가 있거나 실제로 어떤 메서드 및 컨텍스트 내에서 User.all이이 모델 테이블의 올바른 행 수를 반환해야합니다

답변

1

이것은 매우 이상하고 예상치 못한 것입니다. (불행히도 나는 그것을 확인할 수 없습니다. 내 컴퓨터가 추락하고 손에 레일 프로젝트가 없기 때문에).

나는

User.all 

새로운 범위를 만들 기대 (또는 당신은 전화로 - 컨텍스트를)

User.unscoped.all 

편집하여이 문제를 해결 작업을 시도해보십시오

나는 내 프로젝트와 클린 레일 레포에서 그것을 시험해 보았는데 결과는 일관되었다.

조금 생각한 후에도 문제가되지 않을 수도 있습니다. 귀하의 접근 방식이 잘못되었을 수 있습니다.

어떤 시나리오에서 당신은 User.limit(2).all_users_count 체인입니까 ?? 나는 어떤 것도 생각할 수 없다. 하나는 모든 사용자가 cound해야하고, 당신은 User.all_usert_count (또는 User.count)

전화 ... 또는 다른 뭔가가 필요하고 User.limit(2).where(...)를 호출하기 때문에 - 아무 소용이 그 체인 all_users_count 전화에 없다, 그것은 무엇입니까?

그리고 당신이 그것을 생각할 때, 그것은 의미가 있습니다. count_retired과 같은 몇 가지 다른 방법이 있다고 가정 해보십시오. 전화로 무엇을 기대할 수 있습니까?

User.limit(2).count_retired?

퇴직 한 사용자의 수는 2 명을 초과하지 않거나 시스템에있는 모든 퇴직 한 사용자의 수입니까? 나는 이전을 기대할 것이다.

그래서 내가 여기에 두 가지 가능성 중 하나라고 생각 :

  • 중 하나
  • (편집 섹션에서 전술 한 바와 같이) 귀하의 구현 잘못하고, 소리는 다른 방식으로 그것을 또는 당신은 몇 가지 더있다 복잡한 문제지만, 당신은 더 이상 이해가 안되는 지점까지 예제를 끓였습니다 (제발 당신이 원하는 경우 다른 질문을 추가로 따르십시오, 제발, 당신이 할 경우 링크로 의견에 나를 핑 소리를. 흥미)
+0

** 예, 고맙습니다 ** ** "contex t "와"scope "와 다른 것 그리고 내 상황에 대해 아무것도 찾을 수 없습니다. 나는 비슷한 방법이 있다고 의심하지만, 구글을 위해이 문제를 공식화하는 것은 어렵다. 추신. 예, 동의합니다. 예상치 못한 동작이지만, 적어도 제 경우에는 – dmitryck

+0

UPD입니다. 'unscoped'는 몇 가지 간단한 경우에 잘 작동하지만 쿼리가 더 크고 다른 메서드 (클로저 트리와 같은)의 모델에 많은 메서드가 적용되는 경우 - 요약 SQL 쿼리에 대한 몇 가지 추가 조건이며 시작 관계에 따라 달라집니다 ... 이상한 .. ok, 매우 감사합니다! – dmitryck

+0

이것은 이상하고 혼란 스럽습니다. 제가 작업 할 레일 프로젝트가있을 때 이것을 확실히 조사 할 것입니다. – meta