2016-11-22 85 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') –