2016-02-26 2 views
0

У меня есть метод, который принимает необязательные аргументы. И в методе я делаю запрос на необязательные аргументы, как это:Есть ли способ СУХОЙ для этого в Ruby on Rails

def filter_element(param1, *param2) 
     param2[0].empty? ? filtered_element = Model_class.where('city = ?', param1) : filtered_element = Model_class.where('city = ? and price <= ?', param1, param2[0].to_i) 
    end 

Это пример с одним необязательных аргументов, передаваемых в метод.

Мой вопрос: если у меня есть несколько опциональных аргументов и вы хотите использовать его в аргументах запроса в зависимости от его присутствия, как я могу это сделать?

Я знаю, что могу использовать, если, elsif и т. Д. Но я хочу использовать СУХОЙ способ сделать это.

Я уверен, что есть способ, но не смог найти ничего связанного с ним.

+0

Способ с один необязательный аргумент, как правило, выглядит следующим образом: определение функции filter_element (param1, param2 = ноль) '. Кроме того, локальные переменные 'filter_element' и' filter_advertiesments' никогда не используются. – Stefan

+0

Я обновил код. Этот метод возвращает filter_element. Насколько я понимаю, это не очень хорошая практика, чтобы передать nil в запросе, поэтому нет значения nil в качестве значения по умолчанию. – tanvir2362

+0

Вам не нужно присваивать возвращаемое значение переменной вообще, т. Е. Удалить как 'filter_element =', так и просто написать '...? Model_class.where (...): Model_class.where (...) ' – Stefan

ответ

1

Я думаю, что это может быть сделано по-разному

#it's better to pass arguments not like array, but as hash 
def filter_element(city, options = {}) 
    scope = Model_class.where(city: city) 
    scope = scope.where('price <= ?', options[:price].to_i) if options[:price].present? 
    #some more scope limitation here 

    scope 
end 

element = filter_element('Minsk', price: 500) 
+1

С вашим кодом 'options' - это хэш внутри массива, который приведет к исключению. Просто избавьтесь от звездочки, и все будет хорошо. Или еще лучше, используйте 'def filter_element (city, options = {})', чтобы иметь фактический необязательный параметр. –

+0

Или используйте [аргументы ключевого слова] (http://ruby-doc.org/core-2.3.0/doc/syntax/methods_rdoc.html#label-Keyword+Arguments), то есть 'def filter_element (город, цена: ноль) ' – Stefan

+0

Хорошо, позвольте мне попробовать. Спасибо – tanvir2362

Смежные вопросы