提交 eca11bfd 编写于 作者: J José Valim

Merge branch 'master' of git://github.com/rails/rails

......@@ -1510,11 +1510,17 @@ def active_relation
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 @@ class Relation
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 @@ def reload
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 @@ def method_missing(method, *args, &block)
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 @@ def readonly(status = true)
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 @@ def spawn(relation = @relation)
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 @@ def merge(r)
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 @@ def except(*skips)
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)
......
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 @@ def test_transactions_across_databases
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 @@ def test_create_bang
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册