2011-09-21 3 views
0

다중 기준 검색 양식을 만들려고합니다. GET을 통해 검색의 모든 부분을 제출하고 값이 지정된 경우 평가를 받고 싶습니다. 내가 파악하는 데 어려움을 겪고있는 것은 관행 연결을 통해 작업 할 때 맨 위에 더 많은 쿼리를 계층화 할 수있는 쿼리를 작성하는 것입니다. 염두에 모델로, 내가 공통으로 조직이 조각을 잡기 위해 수집 방법을 사용하고, 지금has_many 연관을 통해, 그리고 여러 검색 조건, 내가 어떻게이 일을 할 수 있습니까?

class Client < ActiveRecord::Base 
    has_many :campaigns 
    has_many :pieces, :through => :campaigns 
end 

class Campaign < ActiveRecord::Base 
    belongs_to :client 
    has_many :pieces 
end 

class Piece < ActiveRecord::Base 
    belongs_to :client 
end 

:

그냥 당신이 내 모델을 설정하는 방법에 대한 아이디어를 제공합니다 .

if params.has_key?(:criteria) 
    @selected_client = Client.where(:organization => "Org1") 
    @pieces = @selected_client.collect{ |c| c.pieces }.flatten 
end 

몇 가지 방법으로 @pieces를 좁힐 수 있도록 쿼리 문자열의 서식을 지정하는 방법이 있습니까? 다시 한번 협회를 통해 그것을 사용하여 동일한 고객 기준을 가진 작품을 얻고 싶다고합시다.

감사합니다! 내 뇌는이 시점에서 꽈배기입니다.

답변

1

내가 undestand 잘하고 있는지 당신이 뭘하려고하는지 잘 모르겠습니다. 당신이 레일 3에서, 클라이언트 기준과 일치하는 모든 조각을 얻고 싶은 경우에, 당신은이 작업을 수행 할 수 있습니다

@pieces = Piece.joins(:campaign => :client).where(:clients => {:organization => criteria}) 

조직 "Org1"에서 클라이언트에 속하는 모든 조각을 얻을 수 있습니다.

@Andrew가 말한 것처럼 새로운 조건을 추가하려는만큼 where 문을 스택에 추가 할 수 있습니다. See this for more information.

+0

우후! 내 두뇌는 여전히 내 귀에서 흘러 나오고 있지만, 나는 이것들을 몇 가지 더 만들어야한다. 그리고 이것의 끝 부분에서 희망을 품을 것이다. 내 협회 중 하나가 잘못 설정 되었기 때문에 시간이 좀 걸렸습니다. – counterbeing

0

첫 번째 단락이 끊어졌습니다. 단지 FYI입니다.

@pieces가 배열 인 경우 find 블록을 사용하여 검색 범위를 더욱 좁힐 수 있습니다. 이것은 SQL 데이터베이스보다는 서버 CPU에 부하를 가하게되지만.

where 문장을 스택으로 넣을 수 있으며 레일스는 자동으로 하나의 검색어를 만듭니다. 대신 당신은 SQL을 통해 아래로 검색 범위를 좁히려 @selected_client.pieces.where(...)을 사용할 수 있어야 collect을 사용

@platform = params[:platform] 
@category = params[:category] 
@search = params[:app_q] 

# Get initial SQL, narrow the search, and finally paginate 
@apps = App.live 

@apps = @apps.where("platform = ?", AppPlatforms.value(@platform)) if AppPlatforms.value(@platform) 
@apps = @apps.where("(name LIKE ? OR description LIKE ?)", "%#{@search}%", "%#{@search}%") if @search 
@apps = @apps.where("id IN(?)", @cat.apps) if @category && @cat = Category.find_by_id(@category) 

@apps = @apps.paginate(:page => params[:page], :per_page => 10, :order => "name") 

: 여기에 우리의 웹 사이트의 앱 스토어 섹션에서 일부 샘플 코드입니다.

올바른 방향으로 향하고 싶습니다.

+1

어이 거기에, 나는 이것과 함께 조금 놀았지만 그것을 얻지 못했습니다. 자존심을 가진 제 협회 중 하나가 문제를 일으켰을 수도 있지만, 다른 해결책은 저에게 도움이 될 것 같습니다. 답변 해 주셔서 대단히 감사합니다! – counterbeing

관련 문제