복붙노트

[RUBY-ON-RAILS] 0보다 연관 이상의 수를 가진 모든 기록을 찾기

RUBY-ON-RAILS

0보다 연관 이상의 수를 가진 모든 기록을 찾기

나는 그것을 간단 할 것이라고 생각하는 것이 무엇인가를 할 노력하고있어하지만 일하지 않는 것 같다.

나는 많은 공석이있는 사업 모델을 가지고있다.

class Project < ActiveRecord::Base

  has_many :vacancies, :dependent => :destroy

end

나는 적어도 1 공석이있는 모든 프로젝트를 싶어. 나는 이런 식으로 뭔가를 시도했다 :

Project.joins(:vacancies).where('count(vacancies) > 0')

그러나 말한다

.. "프로젝트"INNER는 "공석"ON "공석" "PROJECT_ID"= "프로젝트" "ID"( "프로젝트"를 가입 FROM "프로젝트"SELECT * "deleted_at : sqlite3를 ::되는 SQLException : 그런 칼럼 : 공석.. ") NULL) AND (카운트 (공극)> 0이다.

해결법

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

    1.효과 만 관련 공석이 프로젝트를 반환합니다 (공석) Project.joins를 사용하므로 내부는 기본적으로 가입 용도를 결합한다.

    효과 만 관련 공석이 프로젝트를 반환합니다 (공석) Project.joins를 사용하므로 내부는 기본적으로 가입 용도를 결합한다.

    최신 정보:

    그룹 절하지 않고 주석의 @mackskatz가 가리키는 밖으로로서, 위의 코드는 하나 개 이상의 공석으로 프로젝트에 대한 중복 프로젝트를 반환합니다. 사용 중복을 제거하려면

    Project.joins(:vacancies).group('projects.id')
    

    최신 정보:

    @Tolsee에 의해 지적, 당신은 또한 별개 사용할 수 있습니다.

    Project.joins(:vacancies).distinct
    

    예로서

    [10] pry(main)> Comment.distinct.pluck :article_id
    => [43, 34, 45, 55, 17, 19, 1, 3, 4, 18, 44, 5, 13, 22, 16, 6, 53]
    [11] pry(main)> _.size
    => 17
    [12] pry(main)> Article.joins(:comments).size
    => 45
    [13] pry(main)> Article.joins(:comments).distinct.size
    => 17
    [14] pry(main)> Article.joins(:comments).distinct.to_sql
    => "SELECT DISTINCT \"articles\".* FROM \"articles\" INNER JOIN \"comments\" ON \"comments\".\"article_id\" = \"articles\".\"id\""
    
  2. ==============================

    2.1) 적어도 1 공석으로 프로젝트를 얻으려면 :

    1) 적어도 1 공석으로 프로젝트를 얻으려면 :

    Project.joins(:vacancies).group('projects.id')
    

    2) 1 개 이상 공석으로 프로젝트를 얻으려면 :

    Project.joins(:vacancies).group('projects.id').having('count(project_id) > 1')
    

    3) 또는 공석 모델 세트가 캐시에 대응하는 경우 :

    belongs_to :project, counter_cache: true
    

    다음이도 작동합니다 :

    Project.where('vacancies_count > ?', 1)
    

    공석 굴곡 규칙을 수동으로 지정해야 할 수 있습니다?

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

    3.조인에 그래, 공석이 필드 아니다. 나는 당신이 원하는 생각 :

    조인에 그래, 공석이 필드 아니다. 나는 당신이 원하는 생각 :

    Project.joins(:vacancies).group("projects.id").having("count(vacancies.id)>0")
    
  4. ==============================

    4.

    # None
    Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 0')
    # Any
    Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 0')
    # One
    Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 1')
    # More than 1
    Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 1')
    
  5. ==============================

    5., 당신은 또한 사용이 포함 또는 eager_load 수 4+ 레일은 같은 대답을 얻을 수 있습니다 :

    , 당신은 또한 사용이 포함 또는 eager_load 수 4+ 레일은 같은 대답을 얻을 수 있습니다 :

    Project.includes(:vacancies).references(:vacancies).
            where.not(vacancies: {id: nil})
    
    Project.eager_load(:vacancies).where.not(vacancies: {id: nil})
    
  6. ==============================

    6.나는 간단한 해결책이 있다고 생각 :

    나는 간단한 해결책이 있다고 생각 :

    Project.joins(:vacancies).distinct
    
  7. ==============================

    7.행하는 내부는 그룹과 결합 has_many 테이블에 참가하거나 UNIQ 잠재적으로 매우 비효율적이고, SQL이 더 잘 구현 될 것이다 세미 조인 용도에 상관 부질으로 존재 함.

    행하는 내부는 그룹과 결합 has_many 테이블에 참가하거나 UNIQ 잠재적으로 매우 비효율적이고, SQL이 더 잘 구현 될 것이다 세미 조인 용도에 상관 부질으로 존재 함.

    이것은 올바른 PROJECT_ID와 행의 존재를 확인하기 위해 공석 테이블을 조사 할 수있는 쿼리 최적화 할 수 있습니다. 하나의 행 또는 그 PROJECT_ID가 백만이 있는지 여부를 중요하지 않습니다.

    즉 레일에서 간단로 아니지만, 달성 할 수있다 :

    Project.where(Vacancies.where("vacancies.project_id = projects.id").exists)
    

    이와 유사하게, 더 공석이없는 모든 프로젝트를 찾을 수 있습니다 :

    Project.where.not(Vacancies.where("vacancies.project_id = projects.id").exists)
    

    편집 : 최근 레일 버전에서 당신은 arel에게 위임되는 존재에 의존하지 않는을 알려주는 중단 경고를 얻을. 이 문제를 함께 해결 :

    Project.where.not(Vacancies.where("vacancies.project_id = projects.id").arel.exists)
    
  8. ==============================

    8.많은 레일 마법이 없다면, 당신은 할 수 있습니다 :

    많은 레일 마법이 없다면, 당신은 할 수 있습니다 :

    Project.where('(SELECT COUNT(*) FROM vacancies WHERE vacancies.project_id = projects.id) > 0')
    

    대부분의 작업은 DB 측에서 직접 수행 될 때 조건이 유형의 모든 레일 버전에서 작동합니다. 또한, .count 방법을 체인이 너무 잘 작동합니다. 전 : (공석) 나는 Project.joins 같은 쿼리에 의해 불에 있었어요. 이 DB의 불가지론이 아니다으로 물론, 장점과 단점이있다.

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

    9.이 오류는 공석은 기본적으로, 프로젝트의 열 아니라고 말하고있다.

    이 오류는 공석은 기본적으로, 프로젝트의 열 아니라고 말하고있다.

    이 작업을해야합니다

    Project.joins(:vacancies).where('COUNT(vacancies.project_id) > 0')
    
  10. from https://stackoverflow.com/questions/20183710/find-all-records-which-have-a-count-of-an-association-greater-than-zero by cc-by-sa and MIT license