This project is archived and is in readonly mode.
Using a where clause on a different table in a scope with a lambda overwrites itself
Reported by darkhelmetlive | April 29th, 2010 @ 10:38 PM
If I make a scope like this:
scope(:id_or_name, lambda { |f, v|
where(f => v.match(/^\d+$/) ? { :id => v } : { :name => v })
})
and then use it like this:
u = User.scoped
u = u.id_or_name(:companies, '1') # like u.where(:accounts => { :id => '1' })
u = u.id_or_name(:divisions, 'engineering') # like u.where(:divisions => { :name => 'engineering' })
# results in "SELECT ... (`divisions`.`name` = 'engineering')"
the first calling gets 'overwritten' and the second one takes effect, when I would expect it to have both conditions in the SQL with an AND. If I do the where clauses myself without the scope, it works.
If the where is for the same table, it works
scope(:id_or_name_same_model, lambda { |v|
where(v.match(/^\d+$/) ? { :id => v } : { :name => v })
})
u = User.scoped
u = u.id_or_name_same_model('1') # like u.where(:id => '1')
u = u.id_or_name_same_model('bob') # like u.where(:name => 'bob')
# results in "SELECT ..... (`users`.`id` = 1) AND (`users`.`name` = 'bob')"
More repro steps and whatnot can be seen in this gist. A full example project is here.
This occurred using the 3.0.0.beta3 gem and edge from github.
Comments and changes to this ticket
-
Neeraj Singh May 12th, 2010 @ 05:02 AM
I am not able to reproduce this error with rails edge.
class Car < AR def self.lab c = Car.scoped c = c.id_or_name(:companies, '1') c = c.id_or_name(:divisions, 'engineering') puts c.to_sql end end
Car.lab is producing following sql
SELECT "cars".* FROM "cars" WHERE ("companies"."id" = '1') AND ("divisions"."name" = 'engineering')
-
darkhelmetlive May 12th, 2010 @ 05:28 AM
I just cloned my repo (http://github.com/darkhelmet/scope_bug) and tried it again with edge, and it fails.
If I run the console and do User.lab it prints the wrong SQL. Is there something I'm missing? Is there some subtle difference between what you are doing to repro and what I did?
class User def self.lab u = User.scoped u = u.id_or_name(:companies, '1') u = u.id_or_name(:divisions, '2') puts u.to_sql end end
user@shell: ./script/rails console Loading development environment (Rails 3.0.0.beta3) irb(main):001:0> User.lab SELECT "users".* FROM "users" WHERE ("divisions"."id" = '2') => nil irb(main):002:0>
-
Ryan Bigg May 13th, 2010 @ 11:52 PM
- Tag changed from active_record, arel, rails3, scope to active_record, arel, bugmash, rails3, scope
- State changed from new to incomplete
Please provide a failing test case and patch for this issue.
-
darkhelmetlive May 17th, 2010 @ 08:29 PM
I tried to write a test case to replicate it, but it worked as it's supposed to. I'm either doing something wrong, or it was broken in beta3 and I didn't properly setup my Gemfile to use full edge for everything.
This can be marked as invalid or whatever is appropriate.
-
Rohit Arondekar June 15th, 2010 @ 01:48 PM
- State changed from incomplete to invalid
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>