title: Rails eager_load with conditions on association
body: <p>I have a Rails application which has <em>Stations</em> (weather stations) and <em>Observations</em>. The app shows many weather stations on a map with the current wind speed and direction. </p>
  
  <p>I have a method which is used on the <code>stations#index</code> method which selects the stations and joins the latest observation per station.</p>
  
  <pre><code>class Station &lt; ActiveRecord::Base
    has_many :observations
    def self.with_observations(limit = 1)
      eager_load(:observations).where(
        observations: { id: Observation.pluck_from_each_station(limit) }
      )
    end
  end
  </code></pre>
  
  <p><code>Observation.pluck_from_each_station</code> returns an array of ids. The <code>observations</code> table contains many thousands of rows so this is necessary to keep rails from eager loading thousands of records.</p>
  
  <p>This method should return all the <em>stations</em> - whether the have any <em>observations</em> or not. However this is currently not the case.</p>
  
  <pre><code>it "includes stations that have no observations" do
    new_station = create(:station)
    stations = Station.with_observations(2)
    expect(stations).to include new_station # fails
  end
  </code></pre>
  
  <p>From my understanding a <code>LEFT OUTER JOIN</code> should return all rows wether the there are any results in the joined table or not. Why is this not working as expected?</p>
  
  <p>This is an example of the SQL generated:</p>
  
  <pre><code>SELECT "stations"."id" AS t0_r0,
         "stations"."name" AS t0_r1,
         "stations"."hw_id" AS t0_r2,
         "stations"."latitude" AS t0_r3,
         "stations"."longitude" AS t0_r4,
         "stations"."balance" AS t0_r5,
         "stations"."timezone" AS t0_r6,
         "stations"."user_id" AS t0_r7,
         "stations"."created_at" AS t0_r8,
         "stations"."updated_at" AS t0_r9,
         "stations"."slug" AS t0_r10,
         "stations"."speed_calibration" AS t0_r11,
         "stations"."firmware_version" AS t0_r12,
         "stations"."gsm_software" AS t0_r13,
         "stations"."description" AS t0_r14,
         "stations"."sampling_rate" AS t0_r15,
         "stations"."status" AS t0_r16,
         "observations"."id" AS t1_r0,
         "observations"."station_id" AS t1_r1,
         "observations"."speed" AS t1_r2,
         "observations"."direction" AS t1_r3,
         "observations"."max_wind_speed" AS t1_r4,
         "observations"."min_wind_speed" AS t1_r5,
         "observations"."temperature" AS t1_r6,
         "observations"."created_at" AS t1_r7,
         "observations"."updated_at" AS t1_r8,
         "observations"."speed_calibration" AS t1_r9
  FROM   "stations"
         LEFT OUTER JOIN
         "observations"
         ON "observations"."station_id" = "stations"."id"
  WHERE  "observations"."id" IN (450, 500, 550, 600, 650, 700, 750, 800);
  </code></pre>