Not being able to order by includes on Rails3

I have the following expression:

user.clocks.includes(:runs

=> :user_runs).includes(:users).find_by_id(params[:id])

which seems to work fine. But when I add an orders, like this:

user.clocks.includes(:runs

=>
:user_runs).includes(:users).orders(“users.names”).find_by_id(params[:id])

it breaks with the following error:

ActiveRecord::ConfigurationError: Association named 'user_runs'

was not found; perhaps you misspelled it?
app/controllers/clocks_controller.rb:19:in show' test/functional/clocks_controller_test.rb:21:in__bind_1286475263_942556’

Any ideas why?

The model looks like this:

class Clock < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_many :runs
end

class Run < ActiveRecord::Base
  belongs_to :clock
  has_many :user_runs
  has_many :users, :through => :user_runs
end

class UserRun < ActiveRecord::Base
  belongs_to :run
  belongs_to :user
end

Continuing with my investigation I’ve tried this:

ubiquitous_user.clocks.includes(:runs

=> :user_runs).find_by_id(params[:id])

and I’ve noticed the queries it’s generating doesn’t get user_runs at
all.

I’ve created a set of tests to try to figure what was going on:

context “A graph of users, clocks, runs, etc” do
setup do
@users = []
10.times do
@users << Factory.create(:user)
end
@clocks = []
10.times do
@clocks << Factory.create(:clock, :users => @users)
end
@clocks.each do |clock|
10.times do
run = Factory.create :run, :clock => clock
@users.each do |user|
Factory.create :user_run, :run => run, :user => user
end
end
end
@user = @users.first
@clock = @clocks.first
end

should "find a clock" do
  assert_not_nil @user.clocks.find(@clock.id)
end

should "find a clock with users" do
  assert_not_nil @user.clocks.includes(:users).find(@clock.id)
end

should "find a clock with users and runs" do
  assert_not_nil

@user.clocks.includes(:users, :runs).find(@clock.id)
end

should "find a clock with users, runs and user_runs" do
  assert_not_nil @user.clocks.includes(:users, :runs

=> :user_runs).find(@clock.id)
end

should "find a clock with users order by users.name" do
  assert_not_nil

@user.clocks.includes(:users).order(“users.name”).find(@clock.id)
end

should "find a clock with users and runs order by users.name" do
  assert_not_nil

@user.clocks.includes(:users, :runs).order(“users.name”).find(@clock.id)
end

should "find a clock with users, runs and user_runs order by

users.name" do
assert_not_nil @user.clocks.includes(:users, :runs
=> :user_runs).order(“users.name”).find(@clock.id)
end
end

Every test but the last one pass. Is this not a bug?

I am now convinced this is a bug, so I reported it here:
https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5768

Next time you have a problem with something like this use the to_sql
method,
it will show you the sql query generated, and you can see what is wrong
with
what you are doing.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs