0
votes

I have a dashboard that allows for filtering of the results by different parameters. I build methods to filter the results by the given criteria. One area where I'm having trouble is if the previous line should null out the active record relation. Should I just put a bunch of if present? stat

def find_website_stats(options = {})
    if options[:date_between].present?
      start_date = options[:date_between].split(/-/).first.to_date
      end_date = options[:date_between].split(/-/).last.to_date + 1
    elsif options[:start_date].present?
      start_date = options[:start_date].to_date
      end_date = options[:end_date].to_date + 1 if options[:end_date].present?
    end

    contractor_name = options[:search_contractor] if options[:search_contractor].present?
    distributor_name = options[:search_distributor] if options[:search_distributor].present?
    distributor_ids = options[:with_distributor] if options[:with_distributor].present?
    contractor_ids = options[:with_contractor] if options[:with_contractor].present?
    with_country = options[:with_country] if options[:with_country].present?
    with_state = options[:with_state] if options[:with_state].present?
    search_city = options[:search_city] if options[:search_city].present?

    web_stats = self.website_stats

    if web_stats.present?
      web_stats = web_stats.where(contractor_id: [*contractor_ids]) if contractor_ids.present?
      if distributor_ids.present?
        web_stat_ids = DistributorWebsiteStat.where(distributor_id: [*distributor_ids]).pluck(:website_stat_id)
        web_stats = web_stats.where(id: [*web_stat_ids])
      end
      web_stats = web_stats.where(date_recorded: start_date..end_date) if start_date.present? && end_date.present?
      web_stats = web_stats.with_country(with_country) if with_country.present?
      web_stats = web_stats.with_state(with_state) if with_state.present?
      web_stats = web_stats.search_city(search_city) if search_city.present?

      #untested
      if contractor_name.present?
        searched_contractor_ids = Brand.search_contractor(contractor_name).pluck(:id)
        web_stats = web_stats.where(contractor_id: [*searched_contractor_ids])
      end

      if distributor_name.present?
        searched_distributor_ids = Brand.search_distributor(distributor_name).pluck(:id)
        web_stat_ids = DistributorWebsiteStat.where(distributor_id: [*searched_distributor_ids])
        web_stats = web_stats.where(id: [*web_stat_ids])
      end
      #end untested
    end

    web_stats
end

Where I'm specifically having a problem right now is the line that says if web_stat_ids.present?

So at first I grab all the website stats this object is associated with and then look to see if there are any for the given distributor.

If there is none for the given distributor web_stat_ids obviously returns nil

Then when I go to the line web_stats.where(id: [*web_stat_ids]) that's obviously going to return the same thing that I had before, rather than an empty active record relation, which is what I need it to be?

If I make this an empty array the next few statements with "where" won't work because it's an array and not an active record relation.

I know I can wrap this stuff in a bunch of if present? && statements...but I was wondering if there is a better solution to my problem?

1

1 Answers

0
votes

In case anyone else is looking for this, found the answer from this SO post: How to return an empty ActiveRecord relation?

Model.none rails 4+