1

У меня есть существующая модель с набором сложных областей: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 + тест) или когда пользователь является администратором (не рабочий код, конечно):

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

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

Один хак я нашел для этого:

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

Но, я имею в виду, это может получить любой уродливее, чем .. :)

ответ

0

Вы должны использовать AREL, прицелы всегда связаны с AND.

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)