mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Merge branch 'master' of git://github.com/rails/rails
This commit is contained in:
@@ -1510,11 +1510,17 @@ module ActiveRecord #:nodoc:
|
||||
end
|
||||
|
||||
def active_relation_table(table_name_alias = nil)
|
||||
Arel::Table.new(table_name, :as => table_name_alias)
|
||||
Arel::Table.new(table_name, :as => table_name_alias, :engine => active_relation_engine)
|
||||
end
|
||||
|
||||
def active_relation_engine
|
||||
@active_relation_engine ||= Arel::Sql::Engine.new(self)
|
||||
@active_relation_engine ||= begin
|
||||
if self == ActiveRecord::Base
|
||||
Arel::Table.engine
|
||||
else
|
||||
connection_handler.connection_pools[name] ? Arel::Sql::Engine.new(self) : superclass.active_relation_engine
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -6,7 +6,7 @@ module ActiveRecord
|
||||
|
||||
attr_reader :relation, :klass
|
||||
attr_writer :readonly, :table
|
||||
attr_accessor :preload_associations, :eager_load_associations, :includes_associations
|
||||
attr_accessor :preload_associations, :eager_load_associations, :includes_associations, :create_with_attributes
|
||||
|
||||
def initialize(klass, relation)
|
||||
@klass, @relation = klass, relation
|
||||
@@ -124,13 +124,13 @@ module ActiveRecord
|
||||
end
|
||||
|
||||
def reset
|
||||
@first = @last = @create_scope = @to_sql = @order_clause = nil
|
||||
@first = @last = @to_sql = @order_clause = @scope_for_create = nil
|
||||
@records = []
|
||||
self
|
||||
end
|
||||
|
||||
def table
|
||||
@table ||= Arel::Table.new(@klass.table_name, Arel::Sql::Engine.new(@klass))
|
||||
@table ||= Arel::Table.new(@klass.table_name, :engine => @klass.active_relation_engine)
|
||||
end
|
||||
|
||||
def primary_key
|
||||
@@ -163,13 +163,15 @@ module ActiveRecord
|
||||
end
|
||||
|
||||
def with_create_scope
|
||||
@klass.send(:with_scope, :create => create_scope) { yield }
|
||||
@klass.send(:with_scope, :create => scope_for_create) { yield }
|
||||
end
|
||||
|
||||
def create_scope
|
||||
@create_scope ||= wheres.inject({}) do |hash, where|
|
||||
hash[where.operand1.name] = where.operand2.value if where.is_a?(Arel::Predicates::Equality)
|
||||
hash
|
||||
def scope_for_create
|
||||
@scope_for_create ||= begin
|
||||
@create_with_attributes || wheres.inject({}) do |hash, where|
|
||||
hash[where.operand1.name] = where.operand2.value if where.is_a?(Arel::Predicates::Equality)
|
||||
hash
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -17,6 +17,10 @@ module ActiveRecord
|
||||
spawn.tap {|r| r.readonly = status }
|
||||
end
|
||||
|
||||
def create_with(attributes = {})
|
||||
spawn.tap {|r| r.create_with_attributes = attributes }
|
||||
end
|
||||
|
||||
def select(selects)
|
||||
if selects.present?
|
||||
relation = spawn(@relation.project(selects))
|
||||
|
||||
@@ -6,6 +6,7 @@ module ActiveRecord
|
||||
relation.preload_associations = @preload_associations
|
||||
relation.eager_load_associations = @eager_load_associations
|
||||
relation.includes_associations = @includes_associations
|
||||
relation.create_with_attributes = @create_with_attributes
|
||||
relation.table = table
|
||||
relation
|
||||
end
|
||||
@@ -32,6 +33,14 @@ module ActiveRecord
|
||||
merged_order = relation_order.present? ? relation_order : order_clause
|
||||
merged_relation = merged_relation.order(merged_order)
|
||||
|
||||
merged_relation.create_with_attributes = @create_with_attributes
|
||||
|
||||
if @create_with_attributes && r.create_with_attributes
|
||||
merged_relation.create_with_attributes = @create_with_attributes.merge(r.create_with_attributes)
|
||||
else
|
||||
merged_relation.create_with_attributes = r.create_with_attributes || @create_with_attributes
|
||||
end
|
||||
|
||||
merged_wheres = @relation.wheres
|
||||
|
||||
r.wheres.each do |w|
|
||||
@@ -56,6 +65,7 @@ module ActiveRecord
|
||||
end
|
||||
|
||||
result.readonly = self.readonly unless skips.include?(:readonly)
|
||||
result.create_with_attributes = @create_with_attributes unless skips.include?(:create_with)
|
||||
|
||||
result = result.joins(@relation.joins(@relation)) unless skips.include?(:joins)
|
||||
result = result.group(@relation.groupings) unless skips.include?(:group)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
require "cases/helper"
|
||||
require 'models/entrant'
|
||||
require 'models/bird'
|
||||
|
||||
# So we can test whether Course.connection survives a reload.
|
||||
require_dependency 'models/course'
|
||||
@@ -82,4 +83,9 @@ class MultipleDbTest < ActiveRecord::TestCase
|
||||
assert_equal "Ruby Development", Course.find(1).name
|
||||
assert_equal "Ruby Developer", Entrant.find(1).name
|
||||
end
|
||||
|
||||
def test_arel_table_engines
|
||||
assert_not_equal Entrant.active_relation_engine, Course.active_relation_engine
|
||||
assert_equal Entrant.active_relation_engine, Bird.active_relation_engine
|
||||
end
|
||||
end
|
||||
|
||||
@@ -545,6 +545,14 @@ class RelationTest < ActiveRecord::TestCase
|
||||
assert_equal 'hen', hen.name
|
||||
end
|
||||
|
||||
def test_explicit_create_scope
|
||||
hens = Bird.where(:name => 'hen')
|
||||
assert_equal 'hen', hens.new.name
|
||||
|
||||
hens = hens.create_with(:name => 'cock')
|
||||
assert_equal 'cock', hens.new.name
|
||||
end
|
||||
|
||||
def test_except
|
||||
relation = Post.where(:author_id => 1).order('id ASC').limit(1)
|
||||
assert_equal [posts(:welcome)], relation.all
|
||||
|
||||
Reference in New Issue
Block a user