diff options
author | Frederick Cheung <frederick.cheung@gmail.com> | 2009-05-07 01:43:15 +0100 |
---|---|---|
committer | Michael Koziarski <michael@koziarski.com> | 2009-05-10 12:50:03 +1200 |
commit | 235775de291787bba6b7bc3c58e791216c3b5090 (patch) | |
tree | 7653eaaa7ba0429a3f08f70debad71e62b223e1a /activerecord/lib/active_record | |
parent | ef6f22ab2aadf619c993527150490d6d48a719c6 (diff) | |
download | rails-235775de291787bba6b7bc3c58e791216c3b5090.tar.gz rails-235775de291787bba6b7bc3c58e791216c3b5090.tar.bz2 rails-235775de291787bba6b7bc3c58e791216c3b5090.zip |
honour :inverse_of for joins based include
Signed-off-by: Michael Koziarski <michael@koziarski.com>
Diffstat (limited to 'activerecord/lib/active_record')
-rwxr-xr-x | activerecord/lib/active_record/associations.rb | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 0952b087d1..2928b0bf83 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -1916,21 +1916,27 @@ module ActiveRecord return nil if record.id.to_s != join.parent.record_id(row).to_s or row[join.aliased_primary_key].nil? association = join.instantiate(row) collection.target.push(association) + collection.__send__(:set_inverse_instance, association, record) when :has_one return if record.id.to_s != join.parent.record_id(row).to_s return if record.instance_variable_defined?("@#{join.reflection.name}") association = join.instantiate(row) unless row[join.aliased_primary_key].nil? - record.send("set_#{join.reflection.name}_target", association) + set_target_and_inverse(join, association, record) when :belongs_to return if record.id.to_s != join.parent.record_id(row).to_s or row[join.aliased_primary_key].nil? association = join.instantiate(row) - record.send("set_#{join.reflection.name}_target", association) + set_target_and_inverse(join, association, record) else raise ConfigurationError, "unknown macro: #{join.reflection.macro}" end return association end + def set_target_and_inverse(join, association, record) + association_proxy = record.send("set_#{join.reflection.name}_target", association) + association_proxy.__send__(:set_inverse_instance, association, record) + end + class JoinBase # :nodoc: attr_reader :active_record, :table_joins delegate :table_name, :column_names, :primary_key, :reflections, :sanitize_sql, :to => :active_record |