0

我有產品和顏色之間的habtm關係。當我對「紅色」和「黑色」產品進行預查詢時,我希望它返回具有「紅色」和「黑色」關聯而不是「紅色」或「黑色」的產品我如何查詢我的數據庫的參數通過「和」而不是「或」

這是我的作用域查詢:

scope :items_design_filter_color, -> (colors) { joins(:colors).where('colors.id' => colors.to_i) unless colors.nil? } 

顏色PARAMS

params[:colors] = ["1", "2"] 

顏色表只是id和name列

打電話給我的範圍:

@products =

Kaminari.paginate_array(ItemsDesign.items_design_by_category(@category.subtree_ids) 
             .items_design_filter_color(params[:colors]) 
             .items_design_filter_sort(sort) 
             .items_design_filter_editors_pick(params[:editors_pick]) 
             .items_design_filter_sold_out(params[:sold_out]) 
             .items_design_filter_style(params[:style]) 
             .items_design_filter_store(params[:store]) 
             .items_design_filter_price(params[:low_end], params[:high_end])) 
    .page(params[:page]).per(48) 

這是我在嘗試使用其中一個答案我的範圍之內波紋管方法:

scope :items_design_by_category, -> (category) { joins(:items_categories).where('items_categories.id' => category) } 
    scope :items_design_filter_color, -> (colors) { joins(:colors).where(colors: {id: colors}).each.select do |item| 
                (item.colors.map(&:id) & colors).size == colors.size 
                end unless colors.nil? } 
    scope :items_design_filter_style, -> (styles) { where('items_style_id' => styles) unless styles.nil? } 
    scope :items_design_filter_store, -> (stores) { where('store_id' => stores) unless stores.nil? } 
    scope :items_design_filter_editors_pick, -> (editors_pick) { where('editors_pick' => TRUE) unless editors_pick.nil? } 
    scope :items_design_filter_sold_out, -> (sold_out) { where('sold_out' => 'n') unless sold_out.nil? } 
    scope :items_design_filter_price, -> (lowend, highend) { where('price_as_decimal' => lowend..highend) unless lowend.nil? } 
    scope :items_design_filter_sort, -> (sort) { order(sort) unless sort.nil? } 
+2

請告訴我們你是怎麼做的?默認情況下(鏈接語句)只有AND。 – nathanvda

+0

該範圍默認爲「或」。目前,當此查詢以多種顏色「紅色」,「黑色」運行時,它將返回「紅色」產品和「黑色」產品,我希望它返回與其關聯的「紅色」和「黑色」產品。只留下僅與「紅色」或僅「黑色」相關聯的產品。希望有意義 – isea

+0

嗯,奇怪的是,這隻會在'colors'(你的參數)是一個數組(它會轉化爲一個'IN' sql-操作符,因此是一個隱式OR)時才起作用,但是你做了一個明確的調用' to_i'會在數組上失敗。但我現在明白你的問題。顏色的數量是否固定,例如總是兩個? – nathanvda

回答

0

OK,以及我最終得到基礎上,某人回答這樣那已被刪除。如果他們想要回來,我會給他們信用。在此期間,這解決了我的問題。

scope :items_design_filter_color, -> (colors) { color_ids = colors.map(&:to_i) unless colors.nil? 
               includes(:colors).where(colors: {id: color_ids}).select do |item| 
                (item.colors.map(&:id) & color_ids).size == color_ids.size 
               end unless colors.nil? } 
相關問題