2014-10-31 2 views
1

Я хотел бы знать, как успешно задать динамический запрос Active Record на основе наличия/существования параметров.строить динамические реквизиты запросов ActiveRecord

У меня есть этот запрос,

Animal.joins(:user).where(animal_type: params[:animal_type], rehomed: params[:rehomed], users: {town: params[:animal_town]}) 

Я пытался что-то вдоль этих линий, но мой синтаксис все неправильно, я считаю,

conditions = [] 
conditions << [ animal_type: params[:animal_type], ] if params[:animal_type].present? 
conditions << [ rehomed: params[:rehomed], ] if params[:rehomed].present? 
conditions << [ users: {town: params[:animal_town]} ] if params[:animal_town].present? 
@animals = Animal.joins(:user).where(conditions) 

Я не хочу, чтобы положить все это в вложенной хэш я?

Любая помощь приветствуется

Спасибо

+0

Почему вы не хотите вкладывать его в вложенный хэш? Он должен быть во вложенном хеше. –

+0

В вашем случае 'where' принимает хэш в любом случае. Таким образом, использование сильных параметров и самого параметра 'params' может быть способом. –

+0

ОК, может быть, сегодня это не так, но для доступа к условиям хэш я бы сделал 'где (условия: условия)'? – Richlewis

ответ

3

Вы должны сделать:

conditions = {} 
conditions.merge!(animal_type: params[:animal_type]) if params[:animal_type].present? 
conditions.merge!(rehomed: params[:rehomed]) if params[:rehomed].present? 
conditions.merge!(users: {town: params[:animal_town]}) if params[:animal_town].present? 

@animals = Animal.joins(:user).where(conditions) 
+0

Более эффективно избегать слияния !: conditions [: animal_type] = params [: animal_type] – ThomasSevestre

1

Я бы somethink так:

scope = Animal.joins(:user) 
scope = scope.where(animal_type: params[:animal_type])  if params[:animal_type].present? 
scope = scope.where(rehomed: params[:rehomed])    if params[:rehomed].present? 
scope = scope.where(users: { town: params[:animal_town] }) if params[:animal_town].present? 

@animals = scope 

Дальнейшие улучшения: Перемещение здания сферы в метод в модели животных:

# in controller 
@animals = Animal.find_by_query(params.slice(:animal_type, :rehomed, :animal_town)) 

# in Animal model 
def self.find_by_query(query = {}) 
    query.reject { |_, v| v.blank? } 

    scope = joins(:user) 
    scope = scope.where(animal_type: query[:animal_type])  if query[:animal_type] 
    scope = scope.where(rehomed: query[:rehomed])    if query[:rehomed] 
    scope = scope.where(users: { town: query[:animal_town] }) if query[:animal_town] 
    scope 
end 
Смежные вопросы