reset @arel when modifying a Relation in place.

/cc @tenderlove
This commit is contained in:
Yves Senn 2014-04-24 12:34:33 -05:00
parent 10ed70185a
commit 1b7aa62b18
3 changed files with 18 additions and 1 deletions

@ -1,3 +1,8 @@
* Reset the cache when modifying a Relation with cached Arel.
Additionally display a warning message to make the user aware.
*Yves Senn*
* PostgreSQL should internally use `:datetime` consistently for TimeStamp. Assures
different spellings of timestamps are treated the same.

@ -84,7 +84,7 @@ def through_scope
end
scope.references! reflection_scope.values[:references]
scope.order! reflection_scope.values[:order] if scope.eager_loading?
scope = scope.order reflection_scope.values[:order] if scope.eager_loading?
end
scope

@ -64,6 +64,7 @@ def #{name}_values # def select_values
#
def #{name}_values=(values) # def select_values=(values)
raise ImmutableRelation if @loaded # raise ImmutableRelation if @loaded
check_cached_relation
@values[:#{name}] = values # @values[:select] = values
end # end
CODE
@ -81,11 +82,22 @@ def #{name}_value # def readonly_value
class_eval <<-CODE, __FILE__, __LINE__ + 1
def #{name}_value=(value) # def readonly_value=(value)
raise ImmutableRelation if @loaded # raise ImmutableRelation if @loaded
check_cached_relation
@values[:#{name}] = value # @values[:readonly] = value
end # end
CODE
end
def check_cached_relation # :nodoc:
if defined?(@arel) && @arel
@arel = nil
ActiveSupport::Deprecation.warn <<-WARNING
Modifying already cached Relation. The cache will be reset.
Use a cloned Relation to prevent this warning.
WARNING
end
end
def create_with_value # :nodoc:
@values[:create_with] || {}
end