ActiveRecord ИЛИ для существующих областей

У меня есть существующая модель с набором сложных областей:

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

Могу чем то сделать

User.test1.test2.test3.all

Теперь, скажем, я хочу добавить к этому глобальную область ИЛИ. т.е. выберите все это (test1 + test2 +test) ИЛИ, когда пользователь является администратором (конечно, не рабочий код):

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

Есть ли способ сделать это с существующей областью, или это требует полностью нового переписывания с AREL или простым SQL?

Один взлом, который я нашел для этого:

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

Но, я имею в виду, может ли это быть еще хуже, чем это..:)

2 ответа

Решение

Вам нужно использовать ARel, области видимости всегда связаны с AND,

Как странный взлом, сфера, которую я предлагаю выше, работает. Однако, как простое решение, кажется, что самый простой подход - выполнить два отдельных запроса и объединить результаты активной записи. Я использовал опцию 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)
Другие вопросы по тегам