2

요약 : 기본적으로 사용자는 배포 목록을 필터링하기 위해 사용자가 parter의 제목을 입력하기를 원합니다. 하나의 분배에는 하나의 프로파일이 있지만, 하나의 상대에는 많은 분배가 있습니다. 누군가가 검색 양식에 하나의 파트너 타이틀을 넣는 경우. 이는 여러 개의 일치하는 ID (multiple matching_profile id)를 통해 여러 배포 ID에 해당합니다.여러 모델을 통한 필터링 문제

나는 문제의 세 가지 모델을 설명한다 :

distribution: 
    belongs_to :matching_profile, :counter_cache => true 

matching_profile: 
    belongs_to :partner 

partner: 
    has_many :matching_profiles 

나는 기본적으로 배포 모델을 통해 partner.title 액세스해야합니다.

는 내가 SQL에서 작업을 수행 할 수 있습니다 select d.* from distributions d join matching_profiles m on d.matching_profile_id = m.id join partners p on m.partner_id = p.id where p.title in ('TITLE') /요약

UPDATE를 : 여기에, 효율적으로, 내가하고 싶은 것입니다. 몇 가지 부족한 부분이 있습니다 ... 제발 도와주세요! 내 컨트롤러에서

난이 :

<%= form_for @search, :url => url_for(:controller => params[:controller], :action => params[:action]), :html => {id => "distribution_workflow",:method => :get} do |f| %> 

<div class="form-block mrl mbm mtm"> 
     <%= f.label 'matching_profile.partner.title_equal', "Partner" %> 
     <%= f.select @search.where('matching_profile_id in (select id from matching_profiles where partner_id in (select id from partners where title in (?)))'), Partner.select(:title), :include_blank => " " %> 
    </div> 

f.select 부분이 잘못된 것입니다하지만 난 노력하고있어 내가의 아이디어를 생각 : 뷰에서

@search = Distribution.workflow.order(sort_column + " " + sort_direction).search(params[:traits_searchable_search]) 

내가 가진 해야할 일은 여기에 담겨있다. 나는 그것을 어떻게하는지 모른다. /업데이트

웹 페이지에 보고서를 표시하고 있으며 사용자가 파트너 제목을 기반으로 사용할 수있는 행을 필터링 할 수 있도록 허용해야합니다. 그러나 파트너의 직책은 내가 양식을 만들었던 모델에 없습니다. 이 형식은 파트너에 대한 참조가있는 matching_profile에 대한 참조가있는 배포 모델 용입니다. 파트너 테이블은 내가 필터링하고 싶은 제목을 포함하고 있습니다.

현재, 내가 다른 search_scope

search_scopes :equal => [:status, 'matching_profile.partner.title'] #obviously very wrong 

업데이 트를 추가하여이 작업을 수행하려고 :

search_scopes :equal => [:status, 'distributions.matching_profile.partner.title'] 

이 나에게 오류를 제공하지 않지만, 필터링하지 않습니다 : 나는이 시도 어느 한 쪽. 올바른 방향의 한 걸음?/업데이트

하지만 제목을 얻으려면 두 테이블을 "홉핑"할 수 없어서 오류가 발생합니다. 나는 오류 메시지에이를보고 있어요 : 물론

AND (matching_profile.partner.title = 'PARTNER_TITLE') 

, 더 matching_profile 필드가 없기 때문에이 잘못 만 matching_profile_id.

나는 이것에 대해 가장 좋은 방법이 무엇인지 잘 모르겠습니다. 모든 조언을 부탁드립니다.

+0

모델에 관계가 있습니까 (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)? – sarnold

+0

아니요': through's. 그냥 : : belongs_to' – Ramy

+0

': through' 키워드에 대한 약간의 연구 - 다른 방향, 즉': has_many' 대신에': belongs_to'의 바로 가기가 필요한 것 같습니다. – Ramy

답변

0

글쎄, 내가해야 할 일은 내 검색 가능한 특성에 검색을 허용하는 새로운 옵션을 추가하는 것입니다. 거기에서 일련 화를 행복하게하기 위해 약간의 재 jiggering을해야했지만 검색 가능한 특성을 확장 할 수 있다는 것을 알았 더라면 비교적 직설적이었습니다.나는이 추가 :

unless options[:in].blank? 
     [options[:in]].flatten.each do |field| 
     scope "#{field}_in", lambda {|value| Rails.logger.info('value: ' + value.to_s) 
     vals = [] 
     value.each do |v| 
      vals << v.split(',') unless v.blank? || v.nil? 
     end 
     {:conditions => ["#{table_names(field)}#{field} in (?)", vals.flatten ]}} 
     end 
    end 
다음

내 유통 모델에 내가 추가 :

search_scopes :in => [:matching_profile_id] 

그리고 마지막으로 내보기에 나는이 할 수있는 :

<div class="form-block mrl mbm mtm"> 
    <%= f.label :matching_profile_id_in, "Partner" %> 
    <%= f.select :matching_profile_id_in, Partner.all.map { |p| [p.title, MatchingProfile.find_all_by_partner_id(p.id).map {|m| m.id}.join(',')]}, {:include_blank => " "}, {:multiple => true} %> 
</div> 

와 컨트롤러가 마술 동일하게 유지를 .