2015-01-23 2 views
1

관련 작업을 특정 작업의 표시 페이지에 표시하려고합니다. 사용자가 특정 작업을 볼 때 태그 (나는 태그를 사용하여 작업을 태그로 사용), 작업 기능 (작업 has_many : job_functions), 경험에 따라 모든 관련 작업을 표시해야합니다 (무게에 따라 표시해야 함) & 국가 (국가 선택 보석 사용).레일 : 고급 sql 쿼리

이 모든 기준이 무게를해야합니다 주어진 작업과 유사하다 작업이있는 경우 =에만 태그 및 작업 기능과 나라가 비슷 다른 작업이이 무게를해야합니다 경우 다른

100 = 70)를 포함한다. 그래서 나는

사실 난 그냥 태그

@related_jobs = Job.tagged_with(@job.tag_list, any: true) 

에 따라 관련 직업을 찾는거야 중량을 기준으로 작업을 정렬 할 수 있습니다 그리고 또한 관련 찾기

@related_jobs = Job.includes(:functions) 
        .where('jobs.id != ?', @job.id) 
        .where(functions: { id: @job.functions.pluck(:id) }) 
+4

큰 목표입니다. 질문이 뭐야? –

+0

어떻게 이것을 할 수 있습니까? 내 코드를 어디에 넣을 까? 그것은 컨트롤러에없는 것 같습니다 – userails

+0

아니, 이것은 컨트롤러에 속하지 않습니다. 이것은 마치 Job 클래스의 메소드 여야합니다. – Brennan

답변

0

직무에 따라 관련 직업을 찾을 수 있습니다 몇 가지 기준에 따라 작업을 수행하고 "일치의 근접성"에 따라 관련 작업에 가중치를주는 것은 Job 클래스의 작업처럼 확실히 들립니다. 나는 Job 클래스에서 메소드 (아마도 'get_related_weighted_jobs')를 생성 할 것이다.

해당 메소드 내에서 Job 인스턴스의 속성을 사용하여 다른 일치하는 작업을 찾아서 할당 한 다음 정렬 된 목록을 리턴하십시오. 컨트롤러는 표시 할 작업을로드 한 다음 해당 작업에서 일치하는 항목을 찾도록 요청합니다.

def show 
    @job = Job.find(params[:id]) 
    @related_jobs = @job.get_related_weighted_jobs() 
end 
+0

작업 모델에서 메소드를 만드는 것이 좋습니다. – userails

+0

예. Job 클래스에서 메소드를 작성하면이 메소드는 현재 작업의 속성에 액세스 할 수 있으며 결국 MVC 세계에서 Job 클래스 자체의 인스턴스보다 관련 작업을 찾을 수있는 엔티티가 더 우수하다. 컨트롤러에 대한 작업은 아니며,보기에 대한 작업이 아닙니다. (의견 - 일치 및 가중치와 같은 비즈니스 논리는 모델에 속함). 특정 작업은 태그, 기능, 경험 및 국가 속성에 따라 다르게 일치하거나 중량이 달라질 수 있습니다. – railsdog

+0

하지만 현재의 작업을 모델의 태그에만 기반한 다른 작업과 어떻게 비교할 수 있습니까? @job = Job.find_by_slug (params [: id])를 호출하고 작업 한 것과 같은 방식으로 작업 할 수 있습니다 컨트롤러에서 – userails