Rails 애플리케이션에서 기본 레코드 필터링을 구현하려고합니다. 하지만 belongs_to
및 has_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_category
및 tagged_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 폼 헬퍼를 사용합니다.