Reputation: 3250
How do I use joins only if a certain condition is true? For example, I have this query:
@courses = Course.find(:all,
:order=> 'courses.name asc',
:include => [:units],
:joins => :course_sub_responsibles,
:group => 'courses.name',
:conditions => conditions)
But I need to join the course_sub_responsibles table only in a certain condition.
Upvotes: 0
Views: 2254
Reputation: 1455
The ActiveRecord.find method takes a Hash as last argument (which is written without curly braces, but it is a hash indeed), which means you can do that:
options = { :order=> 'courses.name asc',
:include => [:units],
:group => 'courses.name',
:conditions => conditions }
options[:join] = :course_sub_responsibles if YOUR CONDITION GOES HERE
@courses = Course.find(:all, options)
Upvotes: 0
Reputation: 16435
You should use ARel-powered methods:
@courses = Course.scoped # Course.all in rails 4
@courses = @courses.order("courses.name asc").includes(:units)
@courses = @courses.joins(:course_sub_responsibles) if YOUR_CONDITION
@courses = @courses.group("courses.name")
@courses = @courses.where(conditions)
@courses
This will only execute the query when the variable is iterated, but the query will be built by pieces, so you can add/remove pieces when you need to.
In Rails4 it will be even cleaner (note the bangs, which mean "modify the receiver" as usual):
@courses = Course.all
@courses.order!("courses.name asc")
@courses.includes!(:units)
@courses.joins!(:course_sub_responsibles) if YOUR_CONDITION
@courses.group!("courses.name")
@courses.where!(conditions)
@courses
Upvotes: 2