aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/associations')
-rw-r--r--activerecord/lib/active_record/associations/association_collection.rb8
-rw-r--r--activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb10
-rw-r--r--activerecord/lib/active_record/associations/has_many_association.rb14
3 files changed, 24 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/associations/association_collection.rb b/activerecord/lib/active_record/associations/association_collection.rb
index cbfbdf1541..7ee567e0b4 100644
--- a/activerecord/lib/active_record/associations/association_collection.rb
+++ b/activerecord/lib/active_record/associations/association_collection.rb
@@ -124,14 +124,6 @@ module ActiveRecord
end
private
- def method_missing(method, *args, &block)
- if @target.respond_to?(method) or (not @association_class.respond_to?(method) and Class.respond_to?(method))
- super
- else
- @association_class.constrain(:conditions => @finder_sql, :joins => @join_sql, :readonly => false) { @association_class.send(method, *args, &block) }
- end
- end
-
def raise_on_type_mismatch(record)
raise ActiveRecord::AssociationTypeMismatch, "#{@association_class} expected, got #{record.class}" unless record.is_a?(@association_class)
end
diff --git a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb
index 1b7adc3f39..2972aa0248 100644
--- a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb
+++ b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb
@@ -76,6 +76,16 @@ module ActiveRecord
end
protected
+ def method_missing(method, *args, &block)
+ if @target.respond_to?(method) || (!@association_class.respond_to?(method) && Class.respond_to?(method))
+ super
+ else
+ @association_class.constrain(:conditions => @finder_sql, :joins => @join_sql, :readonly => false) do
+ @association_class.send(method, *args, &block)
+ end
+ end
+ end
+
def find_target
if @options[:finder_sql]
records = @association_class.find_by_sql(@finder_sql)
diff --git a/activerecord/lib/active_record/associations/has_many_association.rb b/activerecord/lib/active_record/associations/has_many_association.rb
index f5f27dc410..b04cb81a5c 100644
--- a/activerecord/lib/active_record/associations/has_many_association.rb
+++ b/activerecord/lib/active_record/associations/has_many_association.rb
@@ -85,6 +85,20 @@ module ActiveRecord
end
protected
+ def method_missing(method, *args, &block)
+ if @target.respond_to?(method) || (!@association_class.respond_to?(method) && Class.respond_to?(method))
+ super
+ else
+ @association_class.constrain(
+ :conditions => @finder_sql,
+ :joins => @join_sql,
+ :readonly => false,
+ :creation => { @association_class_primary_key_name => @owner.id }) do
+ @association_class.send(method, *args, &block)
+ end
+ end
+ end
+
def find_target
find_all
end