提交 75beb6c7 编写于 作者: A Aaron Patterson

push constructable? on to the reflection

上级 5d8b7760
......@@ -31,7 +31,7 @@ def self.build(model, name, scope, options, &block)
builder = new(name, scope, options, &block)
reflection = builder.build(model)
builder.define_accessors model
builder.define_accessors model, reflection
builder.define_callbacks model, reflection
builder.define_extensions model
reflection
......@@ -82,7 +82,7 @@ def define_callbacks(model, reflection)
#
# Post.first.comments and Post.first.comments= methods are defined by this method...
def define_accessors(model)
def define_accessors(model, reflection)
mixin = model.generated_feature_methods
define_readers(mixin)
define_writers(mixin)
......
......@@ -8,10 +8,6 @@ def valid_options
super + [:foreign_type, :polymorphic, :touch]
end
def constructable?
!options[:polymorphic]
end
def valid_dependent_options
[:destroy, :delete]
end
......@@ -22,7 +18,7 @@ def define_callbacks(model, reflection)
add_touch_callbacks(model, reflection) if options[:touch]
end
def define_accessors(mixin)
def define_accessors(mixin, reflection)
super
add_counter_cache_methods mixin
end
......@@ -58,7 +54,7 @@ def belongs_to_counter_cache_after_update(association, reflection)
if (@_after_create_counter_called ||= false)
@_after_create_counter_called = false
elsif attribute_changed?(foreign_key) && !new_record? && association.constructable?
elsif attribute_changed?(foreign_key) && !new_record? && reflection.constructable?
model = reflection.klass
foreign_key_was = attribute_was foreign_key
foreign_key = attribute foreign_key
......
......@@ -10,10 +10,6 @@ def valid_options
valid
end
def constructable?
!options[:through]
end
def valid_dependent_options
[:destroy, :delete, :nullify, :restrict_with_error, :restrict_with_exception]
end
......
......@@ -6,13 +6,9 @@ def valid_options
super + [:remote, :dependent, :counter_cache, :primary_key, :inverse_of]
end
def constructable?
true
end
def define_accessors(model)
def define_accessors(model, reflection)
super
define_constructors(model.generated_feature_methods) if constructable?
define_constructors(model.generated_feature_methods) if reflection.constructable?
end
# Defines the (build|create)_association methods for belongs_to or has_one association
......
......@@ -200,6 +200,7 @@ def initialize(macro, name, scope, options, active_record)
@automatic_inverse_of = nil
@type = options[:as] && "#{options[:as]}_type"
@foreign_type = options[:foreign_type] || "#{name}_type"
@constructable = calculate_constructable(macro, options)
end
# Returns a new, unsaved instance of the associated class. +attributes+ will
......@@ -208,6 +209,10 @@ def build_association(attributes, &block)
klass.new(attributes, &block)
end
def constructable? # :nodoc:
@constructable
end
def table_name
klass.table_name
end
......@@ -379,6 +384,17 @@ def actual_source_reflection # FIXME: this is a horrible name
end
private
def calculate_constructable(macro, options)
case macro
when :belongs_to
!options[:polymorphic]
when :has_one
!options[:through]
else
true
end
end
# Attempts to find the inverse association name automatically.
# If it cannot find a suitable inverse association name, it returns
# nil.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册