This code is WAY too much and way too domain specific to be in the controller.  Your controller shouldn't need to know all the attributes of the different models let alone how to search and handle YouTube Results.

1. You should have a YouTube object (or a larger SearchService - will get to this later) that handles most of this logic
2. The params you pass should be such that you can easily just pass the hash to an activerecord query, i.e. for getting the [venue](https://github.com/fiddler-crabs-2014/encore/blob/master/app/controllers/searches_controller.rb#L25) `params[:venue]` with `params[:venue][:city]` etc.  Same with concert. This also prevents the weirdness with indexing the array and makes it clearer what's happening
3.  Why are you manually creating a `ConcertArtist`? You should be able to just do `@concert.artists << @band`.  (In fact, you don't actually need this model at all since it holds no. parameters. You can -- and should -- validate the uniqueness with a unique index)
4. Naming - what if you decide to use a different (or additional) provider for artist or concert data? You'd need to change the controller and add more domain specific code.  How about we call these *artist search* and *concert search*?

I'd like to see the search_youtube method look like this:
```ruby
class ConcertController < ApplicationController
  ...

  def search
    @artist = Artist.find_or_create_by(name: params[:artist])
    @venue = Venue.find_or_create_by(params[:venue])
    @concert = Concert.find_or_create_by(params[:concert].merge({ venue_id: @venue.id})

    @concert.artists << @artist

     search = YouTubeSearcher.new(
        artist: @artist, 
        venue: @venue, 
        concert: @concert,
        songs: params[:songs],
        tour: params[:tour]
    )
    
    @results = search.search
  end
end
```

In fact, I'd love to see a `SearchService` which handles getting the objects you need and then doing the type of search you want for *either* artist or concert.  Something like

```ruby
class SearchService
   attr_accessor :params, :search_type, :search_args
 
   def initialize(args)
        params = args
        search_type = params.delete(:search_type)
        search_args = {}
    end

    def search
        find_or_create_objects
        search_args[:songs] = params[:songs]
        
       if search_type == :concert
           YouTubeSearch.new(search_args).search
       elsif search_type == :artist
            MusicBrainzSearch.new(search_args).search
       end
    end

   def find_or_create_objects
       search_args[:artist] = Artist.find_or_create_by(params[:artist]) unless params[:artist].nil?
       # repeat for venue, concert etc
       # add artist to concert
       search_args[:concert].artists << search_args[:artist] unless search_args[:concert].nil?
   end
end

```