복붙노트

[RUBY-ON-RAILS] 어떻게 액티브 / 레일과 NOT IN 쿼리를 표현하는?

RUBY-ON-RAILS

어떻게 액티브 / 레일과 NOT IN 쿼리를 표현하는?

당신이 레일을 트룽 Lê` 및 VinniVidiVicci에 의해 답변에서 4보기를 사용하는 경우 사람들이 와서의이 많이 보이기 때문에 그냥이를 업데이트합니다.

Topic.where.not(forum_id:@forums.map(&:id))

Topic.where(published:true).where.not(forum_id:@forums.map(&:id))

나는 내가 그 일을해야합니다 추측 다음 경우, find_by_sql 포함하지 않는 쉬운 솔루션이 바라고 있어요.

나는이 참조하는이 문서를 발견 :

Topic.find(:all, :conditions => { :forum_id => @forums.map(&:id) })

이는 동일하다

SELECT * FROM topics WHERE forum_id IN (<@forum ids>)

NOT 같은 그,에 할 수있는 방법이 있는지 궁금 :

SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)

해결법

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

    1.4+ 레일 :

    4+ 레일 :

    Article.where.not(title: ['Rails 3', 'Rails 5']) 
    

    3 레일 :

    Topic.where('id NOT IN (?)', Array.wrap(actions))
    

    여기서 활동은 배열과 같다 : 1,2,3,4,5]

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

    2.참고로,에서 레일 4, 당신은하지 구문을 사용할 수 있습니다 :

    참고로,에서 레일 4, 당신은하지 구문을 사용할 수 있습니다 :

    Article.where.not(title: ['Rails 3', 'Rails 5'])
    
  3. ==============================

    3.당신은 뭔가를 시도 할 수 있습니다 :

    당신은 뭔가를 시도 할 수 있습니다 :

    Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.map(&:id)])
    

    ( '') .join을 (ID &) 당신은 @ forums.map을 할 필요가 있습니다. 레일은 열거를 CSV 목록에 인수 인 것입니다 경우 경우 기억이 없습니다.

    또한이 작업을 수행 할 수 있습니다 :

    # in topic.rb
    named_scope :not_in_forums, lambda { |forums| { :conditions => ['forum_id not in (?)', forums.select(&:id).join(',')] }
    
    # in your controller 
    Topic.not_in_forums(@forums)
    
  4. ==============================

    4.Arel 사용 :

    Arel 사용 :

    topics=Topic.arel_table
    Topic.where(topics[:forum_id].not_in(@forum_ids))
    

    또는, 선호하는 경우 :

    topics=Topic.arel_table
    Topic.where(topics[:forum_id].in(@forum_ids).not)
    

    그리고 이후로는 4에 레일 :

    topics=Topic.arel_table
    Topic.where.not(topics[:forum_id].in(@forum_ids))
    

    제발 통지 결국 당신이 그렇게 다음 항목을 얻기 전에 이런 일을해야 할 경우 forum_ids에서, IDS 목록, 오히려 하위 쿼리가 될 싶지 않아 :

    @forum_ids = Forum.where(/*whatever conditions are desirable*/).select(:id)
    

    이런 방식으로 단일 쿼리에서 모든 것을 얻을 : 뭔가를 같이 :

    select * from topic 
    where forum_id in (select id 
                       from forum 
                       where /*whatever conditions are desirable*/)
    

    또한 결국 원하지 않는 것을 통지는이 작업을 수행하는, 오히려 가입 - 더 효율적으로 될 일을.

  5. ==============================

    5.당신이 다음을 수행 할 수 있습니다 레일 4, @Trung Lê 대답에 확장하려면 :

    당신이 다음을 수행 할 수 있습니다 레일 4, @Trung Lê 대답에 확장하려면 :

    Topic.where.not(forum_id:@forums.map(&:id))
    

    그리고 당신은 한 단계 더 걸릴 수 있습니다. 당신은 당신이 원하지 않는 식별자 밖으로 만 발표 주제 및 다음 필터에 대한 첫 번째 필터해야하는 경우, 당신이 할 수 있습니다 :

    Topic.where(published:true).where.not(forum_id:@forums.map(&:id))
    

    4 개 차종이 너무 쉽게 레일!

  6. ==============================

    6.@forums이 비어있는 경우 허용 솔루션은 실패합니다. 이 내가해야 할 일을했을 해결하려면

    @forums이 비어있는 경우 허용 솔루션은 실패합니다. 이 내가해야 할 일을했을 해결하려면

    Topic.find(:all, :conditions => ['forum_id not in (?)', (@forums.empty? ? '' : @forums.map(&:id))])
    

    또는 레일을 3+ 사용하는 경우 :

    Topic.where( 'forum_id not in (?)', (@forums.empty? ? '' : @forums.map(&:id)) ).all
    
  7. ==============================

    7.위의 답변의 대부분은 충분하지만 더 같은 조건 복잡한 조합을 많이하고 있다면 Squeel에서 확인해야합니다. 당신은 같은 일을 할 수있을 것입니다 :

    위의 답변의 대부분은 충분하지만 더 같은 조건 복잡한 조합을 많이하고 있다면 Squeel에서 확인해야합니다. 당신은 같은 일을 할 수있을 것입니다 :

    Topic.where{{forum_id.not_in => @forums.map(&:id)}}
    Topic.where{forum_id.not_in @forums.map(&:id)} 
    Topic.where{forum_id << @forums.map(&:id)}
    
  8. ==============================

    8.당신은 어니 밀러에 의해 meta_where 플러그인 좀보고 할 수 있습니다. 귀하의 SQL 문 :

    당신은 어니 밀러에 의해 meta_where 플러그인 좀보고 할 수 있습니다. 귀하의 SQL 문 :

    SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)
    

    ... 다음과 같이 표현 될 수있다 :

    Topic.where(:forum_id.nin => @forum_ids)
    

    Railscasts의 라이언 베이츠 MetaWhere을 설명하는 멋진 스크린 캐스트를 만들었습니다.

    확실하지 이것이 당신이 찾고있는하지만 내 눈에 확실히 포함 된 SQL 쿼리보다 더 나은 모습입니다 경우.

  9. ==============================

    9.원래 포스트는 특히 숫자 ID를 사용하여 언급,하지만 난 문자열 배열을 가진 NOT IN을 수행하기위한 구문을 찾고 여기에왔다.

    원래 포스트는 특히 숫자 ID를 사용하여 언급,하지만 난 문자열 배열을 가진 NOT IN을 수행하기위한 구문을 찾고 여기에왔다.

    액티브 너무 당신을 위해 잘 그것을 처리합니다 :

    Thing.where(['state NOT IN (?)', %w{state1 state2}])
    
  10. ==============================

    10.이 포럼 ID는 실용적인 방법에서 일을 할 수 있습니까? 예를 들면 당신은 어떻게 든이 포럼을 찾을 수 있습니다 - 그건 당신이 뭔가를해야 할 경우라면

    이 포럼 ID는 실용적인 방법에서 일을 할 수 있습니까? 예를 들면 당신은 어떻게 든이 포럼을 찾을 수 있습니다 - 그건 당신이 뭔가를해야 할 경우라면

    Topic.all(:joins => "left join forums on (forums.id = topics.forum_id and some_condition)", :conditions => "forums.id is null")
    

    는 SQL하지에서하는 것보다 더 효율적이 될 것이다

  11. ==============================

    11.이 방법은 가독성을 위해 최적화 있지만, 데이터베이스 쿼리의 측면에서 효율적으로 아니다 :

    이 방법은 가독성을 위해 최적화 있지만, 데이터베이스 쿼리의 측면에서 효율적으로 아니다 :

    # Retrieve all topics, then use array subtraction to
    # find the ones not in our list
    Topic.all - @forums.map(&:id)
    
  12. ==============================

    12.당신은 당신의 환경에서 SQL을 사용할 수 있습니다 :

    당신은 당신의 환경에서 SQL을 사용할 수 있습니다 :

    Topic.find(:all, :conditions => [ "forum_id NOT IN (?)", @forums.map(&:id)])
    
  13. ==============================

    13.jonnii의 오프 편승 :

    jonnii의 오프 편승 :

    Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.pluck(:id)])
    

    요소를 통해 뽑은보다는 매핑을 사용하여

    railsconf을 통해 당신은 레일이 할 수 몰랐 2012 10 가지 발견

  14. ==============================

    14.그것은 "NULL"를 반환하고 쿼리를 중단하지 않도록 당신은 어디에서 블록의 배열에 빈 배열 추가 "<< ​​0"을 쿼리합니다.

    그것은 "NULL"를 반환하고 쿼리를 중단하지 않도록 당신은 어디에서 블록의 배열에 빈 배열 추가 "<< ​​0"을 쿼리합니다.

    Topic.where('id not in (?)',actions << 0)
    

    작업은 비어 있거나 빈 배열이 될 수 있다면.

  15. ==============================

    15.여기 squeel를 사용하여 레일 4 서브 쿼리를 사용하여 검색어 "NOT IN"더 복잡하다. 물론 아주 느린에 해당하는 SQL에 비해하지만, 이봐, 그것을 작동합니다.

    여기 squeel를 사용하여 레일 4 서브 쿼리를 사용하여 검색어 "NOT IN"더 복잡하다. 물론 아주 느린에 해당하는 SQL에 비해하지만, 이봐, 그것을 작동합니다.

        scope :translations_not_in_english, ->(calmapp_version_id, language_iso_code){
          join_to_cavs_tls_arr(calmapp_version_id).
          joins_to_tl_arr.
          where{ tl1.iso_code == 'en' }.
          where{ cavtl1.calmapp_version_id == my{calmapp_version_id}}.
          where{ dot_key_code << (Translation.
            join_to_cavs_tls_arr(calmapp_version_id).
            joins_to_tl_arr.    
            where{ tl1.iso_code == my{language_iso_code} }.
            select{ "dot_key_code" }.all)}
        }
    

    범위의 제 2 방법은 다른 별명 선언 범위 cavtl1 및 TL1이다. << squeel 연산자에 아니다.

    이 사람을 도움이되기를 바랍니다.

  16. from https://stackoverflow.com/questions/4307411/how-to-express-a-not-in-query-with-activerecord-rails by cc-by-sa and MIT license