복붙노트

[RUBY-ON-RAILS] 어떻게 레일 액티브 체인 여러 쿼리없이 ""절을합니까?

RUBY-ON-RAILS

어떻게 레일 액티브 체인 여러 쿼리없이 ""절을합니까?

나는 레일에 루비의 awesomness을 학습 PHP 개발자이야 내가 액티브 사랑 그리고 난 액티브 방법은 쿼리를 실행하는 방법 체인의 끝을 감지하는 방법입니다 정말 재미있는 무언가를 발견했습니다.

@person = Person.where(name: 'Jason').where(age: 26)

# In my humble imagination I'd think that each where() executes a database query
# But in reality, it doesn't until the last method in the chain

어떻게 이런 마법 작동합니까?

해결법

  1. ==============================

    1.를 Where 메소드가 리턴은 액티브 :: 관계 객체 자체에 의해이 객체는 데이터베이스 쿼리를 실행하지 않습니다. 당신은 문제가이 개체를 사용하는 곳입니다.

    를 Where 메소드가 리턴은 액티브 :: 관계 객체 자체에 의해이 객체는 데이터베이스 쿼리를 실행하지 않습니다. 당신은 문제가이 개체를 사용하는 곳입니다.

    콘솔에서, 당신은 아마이 일을하고 있습니다 :

    @person = Person.where(name: "Jason")
    

    그리고 그것은 제이슨이라는 사람의 배열로 보이는 데이터베이스 쿼리 및 반환을 발행 갑자기 총성이 울 렸죠. 야호, 액티브 레코드!

    그러나 당신이 그런 짓을 :

    @person = Person.where(name: "Jason").where(age: 26)
    

    그리고 다른 쿼리하지만,라고 사람들이 하나의이 (26)이다 제이슨 그러나 그것은 단지 하나 개의 쿼리를 실행있어 문제가, 그래서 어디서 다른 쿼리 이동?

    다른 제안 것처럼 어디 방법은 프록시 객체를 반환하기 때문에,이 일어나고있다. 실제로 쿼리를 수행하고 그렇게하도록 요청하지 않는 이상 데이터 집합을 반환하지 않습니다.

    콘솔에서 아무것도 실행하면 출력에 당신이 실행 무엇이든의 결과를 검사 한 버전을 것입니다. 콘솔에 1을 넣고 Enter 키를 누르십시오 경우 1.inspect 1. 매직 있기 때문에, 당신은 1 개 등을 얻을 것이다! 동일은 "1"에 간다. 다른 개체의 다양한는 정의 방법을 검사하고 루비 다시 무시 무시한 <개체 # 23adbf42560> 같은 것을 반환 객체에 하나 떨어지면 있도록 필요가 없습니다.

    매 액티브 :: 관계 객체는 그래서 쿼리를 유발한다는 그 위에 정의 된 검사 방법이있다. 당신이 당신의 콘솔에서 쿼리를 작성하는 경우, IRB는 당신이 볼 거라고 배열처럼 거의 사람이 읽을 수있는 해당 쿼리 및 출력 뭔가의 반환 값을 검사 호출합니다.

    그냥 표준 루비 스크립트에서이 발행 된 경우에는 쿼리 개체가 검사 될 때까지 실행되지 것입니다 (경유는 검사) 또는 각을 사용을 통해 반복했다, 또는에서 호출 to_a 방법을했다.

    그 세 가지 중 하나가 일어날 때까지, 당신은 체인 수 거기에 문을 당신이 좋아하는 당신이 전화를 할 때 다음 다음 마지막으로 해당 쿼리를 실행, 그것을, to_a 각을 검사 할 것 같은 곳에 많은있다.

  2. ==============================

    2.실제로 데이터베이스에 쿼리를 해고 "키커"로 알려져 있습니다 방법은 여러 가지가있을 수 있습니다. 그 이전에, 그들은 단지 실제 SQL을 생성 한 번 걷어 AST 노드를 생성 (또는 언어로 컴파일 된) 쿼리를 실행합니다.

    실제로 데이터베이스에 쿼리를 해고 "키커"로 알려져 있습니다 방법은 여러 가지가있을 수 있습니다. 그 이전에, 그들은 단지 실제 SQL을 생성 한 번 걷어 AST 노드를 생성 (또는 언어로 컴파일 된) 쿼리를 실행합니다.

    이 작업을 수행하는 방법에 대한 깊은 설명은이 블로그 게시물을 참조하십시오.

  3. ==============================

    3.당신은 코드를 읽을 수 있지만 여기에 하나 개의 개념은 프록시 패턴이다.

    당신은 코드를 읽을 수 있지만 여기에 하나 개의 개념은 프록시 패턴이다.

    아마 @person는 실제 개체 만이 객체에 대한 프록시하지 않고 당신이 어떤 속성을 필요로 할 때 거기에 활성 기록은 마지막으로 쿼리를 실행합니다. Hibernate는 동일한 개념이있다.

  4. ==============================

    4.어쩌면 너무 늦게 비트하지만 당신은 해시를 사용할 수 있습니다 :

    어쩌면 너무 늦게 비트하지만 당신은 해시를 사용할 수 있습니다 :

    @person = Person.where({name: "Jason", age: 26})
    

    쿼리 결과 :

    SELECT "person".* FROM "person"  WHERE "person"."name" = 'Jason' AND "person"."age" = 26
    
  5. from https://stackoverflow.com/questions/10747106/how-does-rails-activerecord-chain-where-clauses-without-multiple-queries by cc-by-sa and MIT license