2015-08-17 3 views
2

Поэтому я должен искать по трем полям. Возраст и пол И этническая принадлежностьActiveRecords: Искать только по непустым параметрам

Если задан только возраст, я должен вернуть все записи, соответствующие возрасту. Если возраст и этническая принадлежность даны, но секс пуст, тогда возвращайте соответствующие записи по возрасту и этнической принадлежности. и т.д ..

Наивный способ решения это так:

class Profile 

    def self.search_profile(search_params_array) 
    if search_params_array.first != nil && search_params_array.second != null && search_params_array.third != null 
     Profile.where("age = ?", search_params_array.first).where("sex = ?", search_params_array.second).where("ethnicity = ?", search_params_array.third) 
    end 
    ... 
    ... # We can permutate between all possible conditions where one of the element is nil 
    ... 
    end 
end 

Что такое лучший способ приблизиться к этому?

ответ

4
class Profile 

    def self.search_profile(search_params_array) 
    params = %w(age sex ethnicity).zip(search_params_array).reject do |_, v| 
     v.nil? 
    end.to_h 
    where(params) 
    end 

end 

Если вы можете передать параметры поиска как хэш, все может стать намного проще.

+0

to_h, похоже, не работает для моей версии ruby. Исправит это и проверит правильность вашего решения –

+0

@ user5233972, так какая у вас версия рубина? – Aetherus

+0

@ user5233972, если 'Array # to_h' недоступен для вас, используйте' Hash :: [] (ary) 'вместо – Aetherus

0

Вы можете создать блок if else или оператор case switch, основанный на вашей логике.

+0

это правда .. Но я надеюсь на решение sql query/activerecord. Эта ситуация, описанная в вопросе, довольно распространена. –

0

Вы можете связать условия в зависимости от наличия параметров.

class Profile 
    def self.searchprofile(search_params_array) 
    scope = Profile.all 
    %w(age sex ethnicity).zip(search_params_array).each do |k, v| 
     next if v.blank? 
     scope = scope.where(k => v) 
    end 
    end 
end 

PS: Я заимствовал zip трюк от ответа Aetherus'!

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