0

Rails 애플리케이션에서 기본 레코드 필터링을 구현하려고합니다. 하지만 belongs_tohas_many 연관을 필터링하는 데 문제가 있습니다.Rails의 관련 레코드로 뷰의 검색 결과 필터링

나는 3 가지 모델이 있습니다 : Job, JobCategory, Tag. 태그는 acts_as_taggable_on 보석을 통해 구현됩니다. 내 Job 모델의 일부 범위가 있습니다, 그것은 제대로 작업과 같습니다

class Job < ApplicationRecord 
    belongs_to :job_category 
    acts_as_taggable_on :tags 

    scope :join_tags, -> { includes(:tags) } 
    scope :salary_min, lambda { |salary_min| 
    where('salary_min >= ? or salary_min IS NULL', salary_min) 
     .where('salary_max >= ? or salary_max IS NULL', salary_min) 
     .where('salary_min >= ? or salary_min IS NULL', salary_min) 
    } 
    scope :salary_max, lambda { |salary_max| 
    where('salary_min <= ? or salary_min IS NULL', salary_max) 
     .where('salary_max <= ? or salary_max IS NULL', salary_max) 
    } 
    scope :by_category, lambda { |*category_id| 
    includes(:job_categories).where(job_category_id: category_id) 
    } 
    scope :tagged_with_id, lambda { |*tag_id| 
    joins(:taggings).where(taggings: { tag_id: tag_id }) 
    } 
end 

JobsController 나의 index 액션은 다음과 같습니다

= form_for jobs_path, method: 'get' do |f| 
    = f.label 'Salary from' 
    = text_field_tag :salary_min, params[:salary_min] 

    = f.label 'Salary to' 
    = text_field_tag :salary_max, params[:salary_max] 

    = f.submit 'Filter', name: nil 
:

def index 
    if params[:tag] 
     @jobs = Job.tagged_with(params[:tag]) 
       .filter(params.slice(:salary_min, :salary_max, :by_category, :tagged_with_id)) 
    else 
     @jobs = Job.published.filter(params.slice(:salary_min, :salary_max, :by_category, :tagged_with_id)) 
       .join_tags 
    end 
    @job_categories = JobCategory.all 
    end 

내가보기에서이 개 범위를 호출 할 수 있습니다

다른 범주를 호출하여 여러 범주 및 태그별로 레코드를 필터링 할 수 있습니까? by_categorytagged_with_id 범위로 전화해야하지만 어떻게 올바르게 수행 할 수 있는지 이해하지 못합니다. 가능한 경우, 컨트롤러에 통과 필터 매개 변수를

= f.collection_check_boxes :job_category_ids, JobCategory.order('priority DESC'), :id, :title, hide_label: true 
= f.collection_select :tag_list, ActsAsTaggableOn::Tag.all.order(:name), :name, :name, {hide_label: true}, html_options = {class: 'js-example-basic-multiple', multiple: 'multiple'} 

나는이 헬퍼를 사용하고 싶지만와 : 내 응용 프로그램에서 다른 형태로

나는 다음 2 폼 헬퍼를 사용합니다.

답변

0

첫번째 배열의 형식으로 범위를 배열 한 후

category_ids = JobCategory.order('priority DESC').pluck(:id) 

passing in argumentscategory_ids를 얻을. 이것은 당신이 문제 코드의

덕분에 나머지는 계산이없는 것으로 판단, 내가 your profile을 확인하고 레일에 루비에 이전 경험을 제공 subset conditions

scope :by_category, ->(category_ids) {  
    where(job_category_id: category_ids) 
    } 

있습니다!