1

我有一个具有一组复杂范围的现有模型:

scope :test1 , where(gift: true)
scope :test2 , lambda {|time| where("last_created_at > ?", time)}
scope :test3 , where(approved: true)

我可以做类似的事情

User.test1.test2.test3.all

现在,假设我想为此附加一个全局 OR 范围。即选择所有这些(test1 + test2 +test)或者当用户是管理员时(当然不是工作代码):

scope :admin , where("OR admin=", true)

有没有办法在现有范围内做到这一点,或者这是否需要使用 AREL 或普通 SQL 进行全新的重写?

我为此发现的一个技巧是:

  scope :admin , where("1=1) OR admin=1 AND (1=1", true)

但是,我的意思是,这会比这更丑吗.. :)

4

2 回答 2

0

您需要使用 ARel,范围始终与AND.

于 2013-05-17T15:53:12.110 回答
0

作为一个奇怪的黑客,我上面建议的范围确实有效。但是,作为一个简单的解决方案,似乎最简单的方法是执行两个单独的查询并连接活动记录结果。我使用了 concat 选项,我认为它也使代码可读,对性能的影响可能微不足道(如果有的话)。

scope :test1 , where(gift: true)
scope :test2 , lambda {|time| where("last_created_at > ?", time)}
scope :test3 , where(approved: true)
scope :admin , where(admin: true)
data1 = User.test1.test2.test3.all
data2 = User.admin.all

(data1 + data2)
于 2013-05-26T11:31:03.120 回答