2012-03-14 2 views
0

나는 세 테이블 '하드웨어', '웨어 하우스'와 '브랜드'와 테이블이이 방법으로 함께 refernced하는 것을 선택 복잡한 MySQL의 변환 창고보기에서이 방법으로 작동하는 검색 드롭 다운 메뉴가 있습니다. 메뉴에서 '브랜드'를 선택하고 제출을 클릭하면 애플리케이션이 choosed 된 모든웨어 하우스 객체를 반환합니다. 웨어 하우스 테이블은 브랜드와 관련이 없으므로 창고 및 브랜드에 가입하는 외래 키가 아닙니다. 그래서 난 내 응용 프로그램 레일이 MySQL의 쿼리를 변환하는 방법을 시도해야합니다. w1.hardware_id = h1.id 및 h1.brand_id = 3레일에 3.1

이 어디

SELECT의 W1은 * 창고의 W1로부터는 H1을 기계 설비 내 코드 :

class WarehousesController < ApplicationController 
def search 
     generate_selects true 
     respond_to do |format| 
      format.html # search.html.erb 
      format.js {render :partial => 'get_models'} 
      format.xml { render :xml => @warehouse } 
     end 
    end 

    def search_result 
     if request.post? && params[:from_form] 
      session[:sa_query_flatten] = sa_query.flatten #Memorizzo sulla session per riutilizzarla in "aggregate_by_position" e will_paginate per page > 1 
     end 
     conditions = session[:sa_query_flatten] 
     logger.debug "QUERY: #{conditions} SESSION:#{session[:sa_query_flatten].inspect}" 
     @products = Warehouse.find(:all,:conditions => conditions) 
     @search_count = @products.count 
     @products = @products.paginate(:page => params[:page], :per_page => 100) 
     @search_start = ((params[:page].to_i - 1)* 100) + 1 
     @search_end = (params[:page].to_i * 100) - 1 
     if @search_start < 0 
     @search_start = @search_start + 100 
     end 
     if @search_end < 0 
     @search_end = @search_end + 100 
     end 
     if @search_end > @search_count 
     @search_end = @search_count 
     end 
     respond_to do |format| 
      format.html 
      format.js 
     end 
    end 

def generate_selects(search) 
     if !search 
      @hardwares ||= Hardware.where({:brand_id => @warehouse.hardware.brand_id}).map{|hw| [hw.model,hw.id]}.sort 
      if session[:user_role] != "administrator" 
       @ingress_transport_documents = IngressTransportDocument.filtered_by_registry(session[:registry_id]).map{|itd| [itd.number,itd.id]}.sort 
      else 
       @ingress_transport_documents = IngressTransportDocument.all.map{|itd| [itd.number,itd.id]}.sort 
      end 
     end 
      @brands = Brand.all.map{|br| [br.name,br.id]}.sort 
      @positions = Position.all.map{|pos| [pos.name,pos.id]}.sort 
      @states = State.all.map{|st| [st.name,st.id]}.sort 
      @logicalWH = Logicalwarehouse.all.map{|lw| [lw.name,lw.id]}.sort 
      @extra = Extra.all.map{|ex| [ex.name,ex.id]}.sort 
      @registries = Registry.all.map{|cs| [cs.name,cs.id]}.sort 

    end 


    def sa_query 
     if params[:warehouse] 
      session[:params_warehouse] = params[:warehouse] 
     else 
      params[:warehouse] = session[:params_warehouse] 
     end 
     query = String.new 
     query_array = Array.new 
     if params[:enable_asset] == "1" 
      query << "asset LIKE ? AND " 
      query_array.push(params[:asset] + "%") 
     end 
     if params[:enable_serial] == "1" 
      query << "serial LIKE ? AND " 
      query_array.push params[:serial] + "%" 
     end 
     if params[:enable_brand] == "1" 
      query << "**brand** => = ? AND " 
      query_array.push Brand.find(params[:brand]).name # Qui va messo brand, non brand_value 
     end 
     if params[:enable_model] == "1" 
      query << "hardware_id.model = ? AND " 
      query_array.push params[:model] 
     end 
     if params[:enable_position] == "1" 
      query << "position_id = ? AND " 
      query_array.push params[:position] 

     end 
     if params[:enable_logicalwarehouse] == "1" 
      query << "logicalwarehouse_id = ? AND " 
      query_array.push params[:logicalwarehouse] 
     end 
     if query.index("AND ",-4) != nil 
     query = query[0,query.length-5] 
     end 
     [query,query_array] 
    end 

MySQL이 쿼리 입력 매개 변수로 어떤 제안을 브랜드 기다려?

답변

0

레일을 사용하는 경우 필자의 조언은 레일즈에서 더 많은 쿼리를 수행하고 가능한 최상의 모델 설정을 사용하여 수행하는 것입니다. 다음과 같이

나는 당신의 3 개 모델을 구성합니다 :

class Warehouse < ActiveRecord::Base 
    has_many : brands 
    has_many : hardwares, :through => brands 
end 


class Brand < ActiveRecord::Base 
    belongs_to :hardware 
    belongs_to :warehouse 
end 

class Hardware < ActiveRecord::Base 
    has_many :brands 
    has_many :warehouses, :through => brands 
end 

이 구조는 다음 원하는 Brand.hardwares 또는 Brand.warehouses 쿼리를 할 수있게된다. 원하는 브랜드에 find을 추가하면됩니다.

+0

ok 이렇게하면웨어 하우스 테이블을 브랜드와 링크하기 위해웨어 하우스에 외래 키를 추가해야합니까? – Marco

+0

예,웨어 하우스 테이블의 brand_id. –