Class: ActiveRecordSurvey::Node::Answer

Inherits:
ActiveRecordSurvey::Node show all
Defined in:
lib/active_record_survey/node/answer.rb

Direct Known Subclasses

Boolean, Rank, Scale, Text

Defined Under Namespace

Classes: Boolean, Rank, Scale, Text

Instance Method Summary collapse

Methods inherited from ActiveRecordSurvey::Node

#answers, #has_instance_node_for_instance?, #instance_node_for_instance, #instance_node_path_to_root?, #is_answered_for_instance?, #remove_link, #validate_instance_node, #validate_parent_instance_node

Instance Method Details



53
54
55
56
57
58
59
# File 'lib/active_record_survey/node/answer.rb', line 53

def build_link(to_node)
	if self.question.nil?
		raise ArgumentError.new "A question is required before calling #build_link"
	end

	super(to_node)
end

#move_downObject

Moves answer down relative to other answers



100
101
102
103
104
105
106
107
108
109
# File 'lib/active_record_survey/node/answer.rb', line 100

def move_down
	self.survey.node_maps.select { |i|
		i.node == self
	}.collect { |node_map|
		begin
			node_map.move_right
		rescue
		end
	}
end

#move_upObject

Moves answer up relative to other answers



88
89
90
91
92
93
94
95
96
97
# File 'lib/active_record_survey/node/answer.rb', line 88

def move_up
	self.survey.node_maps.select { |i|
		i.node == self
	}.collect { |node_map|
		begin
			node_map.move_left
		rescue
		end
	}
end

#next_questionObject

Returns the question that follows this answer



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/active_record_survey/node/answer.rb', line 34

def next_question
	self.survey.node_maps.select { |i|
		i.node == self && !i.marked_for_destruction?
	}.each { |answer_node_map|
		answer_node_map.children.each { |child|
			if !child.node.nil? && !child.marked_for_destruction?
				if child.node.class.ancestors.include?(::ActiveRecordSurvey::Node::Question)
					return child.node
				elsif child.node.class.ancestors.include?(::ActiveRecordSurvey::Node::Answer)
					return child.node.next_question 
				end
			else
				return nil
			end
		}
	}
	return nil
end

#questionObject

Returns the question that preceeds this answer



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/active_record_survey/node/answer.rb', line 15

def question
	self.survey.node_maps.select { |i|
		i.node == self
	}.collect { |node_map|
		if node_map.parent && node_map.parent.node
			# Question is not the next parent - recurse!
			if node_map.parent.node.class.ancestors.include?(::ActiveRecordSurvey::Node::Answer)
				node_map.parent.node.question
			else
				node_map.parent.node
			end
		# Root already
		else
			nil
		end
	}.first
end

#sibling_indexObject

Gets index in sibling relationship



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/active_record_survey/node/answer.rb', line 62

def sibling_index
	if node_map = self.survey.node_maps.select { |i|
		i.node == self
	}.first

		node_map.parent.children.each_with_index { |nm, i|
			if nm == node_map
				return i
			end
		}
	end

	return 0
end

#sibling_index=(index) ⇒ Object



77
78
79
80
81
82
83
84
85
# File 'lib/active_record_survey/node/answer.rb', line 77

def sibling_index=index
	current_index = self.sibling_index

	offset = index - current_index

	(1..offset.abs).each { |i|
		self.send(((offset > 0)? "move_down" : "move_up"))
	}
end

#validate_node(instance) ⇒ Object

Answer nodes are valid if their questions are valid! Validate this node against an instance



5
6
7
8
9
10
11
12
# File 'lib/active_record_survey/node/answer.rb', line 5

def validate_node(instance)
	# Ensure each parent node to this node (the goal here is to hit a question node) is valid
	!self.survey.node_maps.select { |i|
		i.node == self
	}.collect { |node_map|
		node_map.parent.node.validate_node(instance)
	}.include?(false)
end