복붙노트

[RUBY-ON-RAILS] 조건 NIL을 NOT 사용하는 경우 레일

RUBY-ON-RAILS

조건 NIL을 NOT 사용하는 경우 레일

레일에게 내가 반대를 작성합니다 방법 3 스타일을 사용 :

Foo.includes(:bar).where(:bars=>{:id=>nil})

ID가 전무하지 어디 있는지 찾고 싶어요. 나는 시도했다 :

Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql

그러나 반환 :

=> "SELECT     \"foos\".* FROM       \"foos\"  WHERE  (\"bars\".\"id\" = 1)"

그게 내가 필요한 것을 확실히 아니다, 거의 ARel의 버그처럼 보인다.

해결법

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

    1.정식 방법은 레일 3이 작업을 수행합니다 :

    정식 방법은 레일 3이 작업을 수행합니다 :

    Foo.includes(:bar).where("bars.id IS NOT NULL")
    

    이 작업을 수행 할 수 있도록 where.not 위의 액티브 4.0 및 추가 :

    Foo.includes(:bar).where.not('bars.id' => nil)
    Foo.includes(:bar).where.not(bars: { id: nil })
    

    테이블 사이의 범위로 작업 할 때 좀 더 쉽게 기존의 범위를 사용할 수 있도록, 내가 활용 병합하는 것을 선호합니다.

    Foo.includes(:bar).merge(Bar.where.not(id: nil))
    

    항상 조인 전략을 선택하지 않는 포함 때문에, 당신은뿐만 아니라 여기에 대한 참조를 사용해야합니다 그렇지 않으면 유효하지 않은 SQL로 끝날 수 있습니다.

    Foo.includes(:bar)
       .references(:bar)
       .merge(Bar.where.not(id: nil))
    
  2. ==============================

    2.그것은 ARel의 버그 아니라, 당신의 논리의 버그입니다.

    그것은 ARel의 버그 아니라, 당신의 논리의 버그입니다.

    당신이 여기에 원하는 것은 :

    Foo.includes(:bar).where(Bar.arel_table[:id].not_eq(nil))
    
  3. ==============================

    3.Rails4 경우 :

    Rails4 경우 :

    그래서, 당신이 원하는거야 당신이 정말로 단지 술어 조인 사용해야 있도록 내부가, 조인 :

      Foo.joins(:bar)
    
      Select * from Foo Inner Join Bars ...
    

    당신이 "NOT NULL"을 원한다면, 기록을 위해, 조건은 단순히 술어하지를 사용 :

    Foo.includes(:bar).where.not(bars: {id: nil})
    
    Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
    

    참고이 구문은 중단을 (그것이 문자열 SQL 조각에 대해 이야기하지만 해시 조건이 파서에서 문자열로 변경 추측?), 그래서 결국에 대한 참조를 추가해야합니다보고합니다 :

    Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
    
  4. ==============================

    4.확실하지이 유용하지만, 레일에 나를 위해 일한 것을이 4의

    확실하지이 유용하지만, 레일에 나를 위해 일한 것을이 4의

    Foo.where.not(bar: nil)
    
  5. ==============================

    5.레일 4로 그것은 간단합니다 :

    레일 4로 그것은 간단합니다 :

     Foo.includes(:bar).where.not(bars: {id: nil})
    

    또한보십시오:     http://guides.rubyonrails.org/active_record_querying.html#not-conditions

  6. from https://stackoverflow.com/questions/4252349/rails-where-condition-using-not-nil by cc-by-sa and MIT license