I recently had a problem (on Rails 4.1.2) trying to join on a polymorphic 
association where the polymorphic type was known ahead of time.

class EmailLog < ActiveRecord::Base
  belongs_to :related_object
end

I had a query like this:

EmailLog.where(related_object_type: "FooBar").joins(:related_object)

This fails because the `related_object_type` in the `where` doesn't seem to 
carry through to the `joins`, and since `related_object` is a polymorphic 
association, it complains.

>> EmailLog.joins(:related_object).to_sql
ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the 
polymorphic association :related_object

>> EmailLog.where(related_object_type: "FooBar").joins(:related_object)
ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the 
polymorphic association :related_object

I then discovered that there's actually a way around this problem by 
specifying a relationship that piggy-backs on `related_object`:

belongs_to :foo_bar, -> { where(email_logs: { related_object_type: "FooBar" 
}) }, foreign_key: "related_object_id"

This is `joins`able:

EmailLog.joins(:foo_bar).to_sql
#=> "SELECT `email_logs`.* FROM `email_logs` INNER JOIN `foo_bars` ON 
`foo_bars`.`id` = `email_logs`.`related_object_id` AND 
`email_logs`.`related_object_type` = 'FooBar'"

It would be nice if the `where(related_object_type: "FooBar")` information 
could be carried forward to the `joins` call automatically, so that the 
original attempted query could work. I had originally thought that maybe a 
syntax like this would be useful:

EmailLog.joins(related_object: :foo_bar)

But then I realised that this obviously conflicts with the existing syntax 
for nested joins. I'm sure there's something expressive that would be 
equivalent to defining the `belongs_to :foo_bar` and using 
`EmailLog.joins(:foo_bar)`, though.

I'm not sure how possible this actually is. I also have no clue how to even 
start, otherwise I'd PR it!

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to