mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
infer references from Relation#order
This commit is contained in:
parent
a84a20e1cd
commit
46ea4442f3
2 changed files with 28 additions and 2 deletions
|
@ -106,8 +106,14 @@ module ActiveRecord
|
|||
def order(*args)
|
||||
return self if args.blank?
|
||||
|
||||
args = args.flatten
|
||||
references = args.reject { |arg| Arel::Node === arg }
|
||||
.map { |arg| arg =~ /^([a-zA-Z]\w*)\.(\w+)/ && $1 }
|
||||
.compact
|
||||
|
||||
relation = clone
|
||||
relation.order_values += args.flatten
|
||||
relation = relation.references(references) if references.any?
|
||||
relation.order_values += args
|
||||
relation
|
||||
end
|
||||
|
||||
|
|
|
@ -1176,17 +1176,37 @@ class RelationTest < ActiveRecord::TestCase
|
|||
assert !scope.eager_loading?
|
||||
end
|
||||
|
||||
def test_automatically_added_references
|
||||
def test_automatically_added_where_references
|
||||
scope = Post.where(:comments => { :body => "Bla" })
|
||||
assert_equal ['comments'], scope.references_values
|
||||
|
||||
scope = Post.where('comments.body' => 'Bla')
|
||||
assert_equal ['comments'], scope.references_values
|
||||
end
|
||||
|
||||
def test_automatically_added_having_references
|
||||
scope = Post.having(:comments => { :body => "Bla" })
|
||||
assert_equal ['comments'], scope.references_values
|
||||
|
||||
scope = Post.having('comments.body' => 'Bla')
|
||||
assert_equal ['comments'], scope.references_values
|
||||
end
|
||||
|
||||
def test_automatically_added_order_references
|
||||
scope = Post.order('comments.body')
|
||||
assert_equal ['comments'], scope.references_values
|
||||
|
||||
scope = Post.order('comments.body', 'yaks.body')
|
||||
assert_equal ['comments', 'yaks'], scope.references_values
|
||||
|
||||
# Don't infer yaks, let's not go down that road again...
|
||||
scope = Post.order('comments.body, yaks.body')
|
||||
assert_equal ['comments'], scope.references_values
|
||||
|
||||
scope = Post.order('comments.body asc')
|
||||
assert_equal ['comments'], scope.references_values
|
||||
|
||||
scope = Post.order('foo(comments.body)')
|
||||
assert_equal [], scope.references_values
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue