Fixing assiging hashes to casted arrays properties
This commit is contained in:
parent
7e054fd948
commit
ea4325f5bf
|
@ -26,13 +26,9 @@ module CouchRest::Model
|
||||||
if type.is_a?(Array)
|
if type.is_a?(Array)
|
||||||
if value.nil?
|
if value.nil?
|
||||||
value = []
|
value = []
|
||||||
elsif value.is_a?(Hash)
|
elsif [Hash, HashWithIndifferentAccess].include?(value.class)
|
||||||
# Assume provided as a Hash where key is index!
|
# Assume provided as a params hash where key is index
|
||||||
data = value
|
value = parameter_hash_to_array(value)
|
||||||
value = [ ]
|
|
||||||
data.keys.sort.each do |k|
|
|
||||||
value << data[k]
|
|
||||||
end
|
|
||||||
elsif !value.is_a?(Array)
|
elsif !value.is_a?(Array)
|
||||||
raise "Expecting an array or keyed hash for property #{parent.class.name}##{self.name}"
|
raise "Expecting an array or keyed hash for property #{parent.class.name}##{self.name}"
|
||||||
end
|
end
|
||||||
|
@ -78,6 +74,14 @@ module CouchRest::Model
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def parameter_hash_to_array(source)
|
||||||
|
value = [ ]
|
||||||
|
source.keys.each do |k|
|
||||||
|
value[k.to_i] = source[k]
|
||||||
|
end
|
||||||
|
value.compact
|
||||||
|
end
|
||||||
|
|
||||||
def associate_casted_value_to_parent(parent, value)
|
def associate_casted_value_to_parent(parent, value)
|
||||||
value.casted_by = parent if value.respond_to?(:casted_by)
|
value.casted_by = parent if value.respond_to?(:casted_by)
|
||||||
value.casted_by_property = self if value.respond_to?(:casted_by_property)
|
value.casted_by_property = self if value.respond_to?(:casted_by_property)
|
||||||
|
|
|
@ -276,9 +276,9 @@ describe "properties of array of casted models" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should allow attribute to be set from hash with ordered keys and sub-hashes" do
|
it "should allow attribute to be set from hash with ordered keys and sub-hashes" do
|
||||||
@course.questions = { '0' => {:q => "Test1"}, '1' => {:q => 'Test2'} }
|
@course.questions = { '10' => {:q => 'Test10'}, '0' => {:q => "Test1"}, '1' => {:q => 'Test2'} }
|
||||||
@course.questions.length.should eql(2)
|
@course.questions.length.should eql(3)
|
||||||
@course.questions.last.q.should eql('Test2')
|
@course.questions.last.q.should eql('Test10')
|
||||||
@course.questions.last.class.should eql(Question)
|
@course.questions.last.class.should eql(Question)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -295,7 +295,7 @@ describe "properties of array of casted models" do
|
||||||
it "should raise an error if attempting to set single value for array type" do
|
it "should raise an error if attempting to set single value for array type" do
|
||||||
lambda {
|
lambda {
|
||||||
@course.questions = Question.new(:q => 'test1')
|
@course.questions = Question.new(:q => 'test1')
|
||||||
}.should raise_error
|
}.should raise_error(/Expecting an array/)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue