Как упростить запрос активной записи в Ruby - PullRequest
0 голосов
/ 18 марта 2019

Я хочу фильтровать по стране, городу, штату, роли и тарифной карточке. Если пользователь выбирает какое-либо одно средство или любые комбинации, это должно работать. Это моя активная запись для поиска:

if params[:role].present?
  if params[:role] == 'role1'
    if params[:city_name].present?
      @matching_c = @matching_c.where(city_name: params[:city_name])
    elsif params[:state].present?
      @matching_c = @matching_c.where(state: params[:state])
    elsif params[:country].present?
      @matching_c = @matching_c.where(country: params[:country])
    end
    if params[:rate_card].present?
      @matching_c = @matching_c.joins(:rate_card).where("rate_cards.rate_card_type = ?", "#{params[:rate_card]}")
    end
    @matching_f = nil
  end
  if params[:role]  == 'role2'
    if params[:city_name].present?
      @matching_f = @matching_f.where(city_name: params[:city_name])
    elsif params[:state].present?
      @matching_f = @matching_f.where(state: params[:state])
    elsif params[:country].present?
      @matching_f = @matching_f.where(country: params[:country])
    end
    if params[:rate_card].present?
      @matching_f = @matching_f.joins(:rate_card).where("rate_cards.rate_card_type = ?", "#{params[:rate_card]}")
    end
    @matching_c = nil
  end
else
  if params[:city_name].present?
    @matching_f = @matching_f.where(city_name: params[:city_name])
    @matching_c = @matching_c.where(city_name: params[:city_name])
  elsif params[:state].present?
    @matching_f = @matching_f.where(state: params[:state])
    @matching_c = @matching_c.where(state: params[:state])
  elsif params[:country].present?
    @matching_c = @matching_c.where(country: params[:country])
    @matching_f = @matching_f.where(country: params[:country])
  end
  if params[:rate_card].present?
    @matching_c = @matching_c.joins(:rate_card).where("rate_cards.rate_card_type = ?", "#{params[:rate_card]}")
    @matching_f = @matching_f.joins(:rate_card).where("rate_cards.rate_card_type = ?", "#{params[:rate_card]}")
  end
end

Это работает, но я хочу, чтобы это было упрощено. Кто-нибудь может помочь с этим?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

Вы должны связать области видимости, не исключая их взаимно:

@matching_c = @matching_c.where(city_name: params[:city_name]) if
  params[:city_name].present?
@matching_c = @matching_c.where(state: params[:state]) if 
  params[:state].present?
@matching_c = @matching_c.where(country: params[:country]) if
  params[:country].present?
2 голосов
/ 18 марта 2019
def add_where(query, params)
  # FROM HERE
  field = %i(city_name state country).find { |x| params[x].present? }
  if field
    query = query.where(field => params[field])
  end
  # TO HERE

  if params[:rate_card].present?
    query = query.joins(:rate_card).where("rate_cards.rate_card_type = ?", params[:rate_card])
  end

  query
end

@matching_c = params[:role] != 'role2' ? add_where(@matching_c, params) : nil
@matching_f = params[:role] != 'role1' ? add_where(@matching_f, params) : nil

Принимается только один из (город, штат, страна), такой как ваш код. Если вы хотите принять любую комбинацию, используйте это вместо отмеченного кода:

%i(city_name state country).each { |field|
  query = query.where(field => params[field]) if params[field].present?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...