2016-11-22 84 views
1

合併範圍可以說我有這3個範圍:軌道4 - 在乾燥方式

scope :assembly_reclamation, -> { where(status: 5) } 
scope :customer_reclamation, -> { where(status: 9) } 
scope :wrong_delivery,  -> { where(status: 12) } 

現在,讓我們說,我要作出這樣的連接這3個類別的一個範圍。我現在這樣做:

scope :returnable, -> { where(status: [5, 9, 12]) } 

雖然這個工程,它有一些缺點。如果我要改變三個類別中的一個的條件,我將不得不重新修改包含它們的範圍。

像這樣的事情似乎更幹:

scope :returnable, -> { assembly_reclamation.or.customer_reclamation.or.wrong_delivery } 

但是,這不是有效的代碼。

有沒有辦法以這種方式編碼?

UPDATE

我知道我已經使用使用類別和ID的例子,但請不要讓這件事。它涉及合併範圍。

更新2 我已經改變從idstatus屬性的名稱,因爲大家都專注於id的問題,而不是問題

+0

http://stackoverflow.com/questions/6686920/activerecord-query-union可以幫助你 – Ilya

+0

硬編碼數據庫生成的ID進入你的應用程序代碼是一個壞主意。主要是因爲它不適合測試,因爲它要求將所有記錄以相同順序插入到數據庫中。 – max

+1

還記得範圍只是類方法。如果你正在寫的東西不適合一個lambda塊,它應該被重構成一個普通的類方法。 – max

回答

1

如果你真的是點處理category_ids,這將是任何人,如果你在Category模型具有這些ID爲常數誰讀代碼更有意義:

class Category 
    ASSEMBLY_RECLAMATION_ID = 5 
    CUSTOMER_RECLAMATION_ID = 9 
    WRONG_DELIVERY_ID  = 12 
    RETURNABLE_IDS   = [ASSEMBLY_RECLAMATION_ID, CUSTOMER_RECLAMATION_ID, WRONG_DELIVERY_ID] 
end 

FRO現在,你可以在你的作用域中使用這些常量,只改變常量,而不是作用域的實現。

P.S. Rails 5 added OR support,但在升級之前它與您無關。

編輯

一到幾個範圍相結合的方法如下:

scope :returnable, lambda { 
    where(id: assembly_reclamation.ids + customer_reclamation.ids + wrong_delivery.ids) 
} 
+0

這只是一個例子。我正在尋找一種合併範圍的方法。對於範圍標準的東西,我可以添加更多的東西,而不僅僅是搜索一個id。 –

+0

@EnriqueMorenoTent編輯答案 –

+0

它不能解決問題。它仍然取決於用於符合該標準的邏輯(它可能不僅僅是滿足'id') –