2016-06-02 2 views
0

Proc используется в нашем коде для выбора записей. Вот пример:Условный проход в рубинах/рельсах?

Proc.new { models.where('payment_requestx_payment_requests.paid = ?', params[:paid_s] == 'true')} 

Мы ищем способ запуска этого Proc если простое условие. В противном случае пропустите Proc, если условие возвращает false. Что-то вроде:

Proc.new { models.where('payment_requestx_payment_requests.paid = ?', params[:paid_s] == 'true') if params[:condition] == 'true' } 

условия, должно быть внутри Proc. Это что-то можно сделать в рубинах/рельсах?

+4

Что ответит proc, если условие было ложным? –

+1

Пример, который вы опубликовали, является действительным рубином - какой аспект этого не работает? –

+0

'Фредерик', я не пробовал. Я не нашел подобного примера в Интернете и не уверен, что 'Proc' возьмет' if'. Запустится. – user938363

ответ

1

Воссоздание установки вы имеете дело с (вроде):

p = Proc.new { [{a:1}, {b:2}] } 
p.call 
=> [{:a=>1}, {:b=>2}] 

с если утверждение:

p = Proc.new { [{a:1},{b:2}] if false } 
p.call 
=> nil 

Активная запись возвращает пустой массив, если никакие записи не удовлетворяют Where поэтому я бы предположил, что это то, что вам нужно предоставить:

p = Proc.new { false ? [{a:1},{b:2}] : [] } 
p.call 
=> [] 

Или в вашем случае:

Proc.new { params[:condition] == 'true' ? models.where('payment_requestx_payment_requests.paid = ?', params[:paid_s] == 'true') : [] } 

Caveat Emptor.

+2

Model.none - это более кошерный способ вернуть пустой ActiveRecord –

1

Может быть, может помочь троичный оператор?

p = Proc.new {condition ? puts('condition is true!') : puts('condition is false!')} 
condition = false 
p.call 
>> condition is false! 
condition = true 
p.call 
>> condition is true! 
Смежные вопросы