Avoid RecordNotFound on polymorphic parent loading using :find_by Rails 4 not working #987

Closed
guigoliveira opened this Issue Jan 23, 2014 · 0 comments

Comments

Projects
None yet
1 participant
@guigoliveira

Hello guys,

Normally on previous versions of Rails when you have a polymorphic model and you want to load a resource through it, you first need to load all possible parent resources and then you load you resource using :though option. Since you have different models being loaded only one will succeed and the others will fail, to prevent a recordnotfound exception you would normally use the :find_by option with a :find_by_id to prevent the bang, using just :id would instead raise the exception.

def find_resource
  if @options[:singleton] && parent_resource.respond_to?(name)
    parent_resource.send(name)
  else
    if @options[:find_by]
      if resource_base.respond_to? "find_by_#{@options[:find_by]}!"
        resource_base.send("find_by_#{@options[:find_by]}!", id_param)
      elsif resource_base.respond_to? "find_by"
        resource_base.send("find_by", { @options[:find_by].to_sym => id_param })
      else
        resource_base.send(@options[:find_by], id_param)
      end
    else
      adapter.find(resource_base, id_param)
    end
  end
end

Apparently rails 3 classes did not responded to the "find_by" method, so using :find_by => :find_by_id would match the else clause successfuly avoiding the bang in the first if clause:

      else
        resource_base.send(@options[:find_by], id_param)
      end

Starting a new project using Rails 4.0.2 I noticed after a few moments debugging that rails activerecord classes now do respond to "find_by" method alone. This makes impossible to prevent the exception because if you use :find_by => :id would match the first clause, which has a bang in it. If you use :find_by => :find_by_id won´t match the first one but will instantly match the second, translating into this:

resource_base.send("find_by",{ :find_by_id, 1})

"find_by" runs a where, so this call will result in a field not found exception. Also, you are restricted by the "=>" operator which blocks you from doing something like "id = ?", 1

I hope i´m not missing something here, I don´t like making anyone trouble, this gem is awesome and I truly believe we have an issue here.

Regards.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment