census 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -84,6 +84,25 @@ to render the partial:
84
84
 
85
85
  <%= render 'census/user_answers', :user => @user %>
86
86
 
87
+ == Accessing a User's Answers
88
+
89
+ From your User object, you can get to that user's answers using methods that
90
+ are automatically generated for each of your data groups and questions. For
91
+ example, let's assume you have a data group called "Physical Attributes" with
92
+ questions for "Weight" and "Hair Color." You can retrieve a user's answers
93
+ like this:
94
+
95
+ user.census_data.physical_attributes.weight
96
+ user.census_data.physical_attributes.hair_color
97
+
98
+ If your data group and question names change frequently, or if you've exposed
99
+ the census admin UI so that the questions can be changed by your users, you'll
100
+ probably want to avoid relying on the auto-generated method names. Instead,
101
+ you can access the user's answers using strings, like this:
102
+
103
+ user.census_data['Physical Attributes']['Weight']
104
+ user.census_data['Physical Attributes']['Hair Color']
105
+
87
106
  == Searching
88
107
 
89
108
  Census provides a search interface for finding users whose answers match a list
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.4.1
data/lib/census/user.rb CHANGED
@@ -67,6 +67,14 @@ module Census
67
67
  def answer_for_choice(choice)
68
68
  answers.select {|a| a.question == choice.question && a.data == choice.value}.first || answers.build(:question => choice.question, :data => '')
69
69
  end
70
+
71
+ #
72
+ # Returns a Census::UserData object that can be used to retrieve this user's
73
+ # answers.
74
+ #
75
+ def census_data
76
+ @census_data ||= Census::UserData.new(self)
77
+ end
70
78
 
71
79
  private
72
80
 
@@ -0,0 +1,53 @@
1
+ module Census
2
+ class UserData
3
+
4
+ def initialize(user, data_group = nil)
5
+ @user = user
6
+
7
+ if data_group
8
+ @questions = {}
9
+ define_question_methods(data_group)
10
+ else
11
+ @data_groups = {}
12
+ define_data_group_methods
13
+ end
14
+ end
15
+
16
+ def [](key)
17
+ if @data_groups
18
+ @data_groups[key]
19
+ else
20
+ @user.first_answer_for(@questions[key]).formatted_data
21
+ end
22
+ end
23
+
24
+
25
+ private
26
+
27
+
28
+ def define_data_group_methods
29
+ DataGroup.all.each do |group|
30
+ @data_groups[group.name] = Census::UserData.new(@user, group)
31
+
32
+ (class << self; self; end).class_eval do
33
+ define_method group.name.parameterize.underscore do
34
+ @data_groups[group.name]
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def define_question_methods(data_group)
41
+ data_group.questions.each do |question|
42
+ @questions[question.prompt] = question
43
+
44
+ (class << self; self; end).class_eval do
45
+ define_method question.prompt.parameterize.underscore do
46
+ @user.first_answer_for(question).formatted_data
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -29,13 +29,6 @@ class AnswerTest < ActiveSupport::TestCase
29
29
  a = Factory(:answer, :question => Factory(:question, :data_type => 'Number'), :data => '5389')
30
30
  assert_equal 5389, a.formatted_data
31
31
  end
32
-
33
- should "format booleans" do
34
- a = Factory(:answer, :question => Factory(:question, :data_type => 'Yes/No'), :data => '0')
35
- assert_equal false, a.formatted_data
36
- a.data = '1'
37
- assert_equal true, a.formatted_data
38
- end
39
32
 
40
33
  end
41
34
 
@@ -168,44 +168,6 @@ class QuestionTest < ActiveSupport::TestCase
168
168
 
169
169
  end
170
170
 
171
- context "with Yes/No data type" do
172
-
173
- setup do
174
- @question.data_type = 'Yes/No'
175
- end
176
-
177
- should "return a boolean sql transform" do
178
- assert_equal "CAST(? AS CHAR)", @question.sql_transform
179
- end
180
-
181
- context "with answers" do
182
-
183
- setup do
184
- @answer1 = Factory(:answer, :question => @question)
185
- @answer1.update_attribute(:data, false)
186
- @answer2 = Factory(:answer, :question => @question, :data => true)
187
- end
188
-
189
- should "find answers matching true" do
190
- assert @question.find_answers_matching(true).include?(@answer2)
191
- end
192
-
193
- should "not find answers not matching true" do
194
- assert !@question.find_answers_matching(true).include?(@answer1)
195
- end
196
-
197
- should "find answers matching false" do
198
- assert @question.find_answers_matching(false).include?(@answer1)
199
- end
200
-
201
- should "not find answers not matching false" do
202
- assert !@question.find_answers_matching(false).include?(@answer2)
203
- end
204
-
205
- end
206
-
207
- end
208
-
209
171
  end
210
172
 
211
173
  end
@@ -6,4 +6,42 @@ class UserTest < ActiveSupport::TestCase
6
6
  should_accept_nested_attributes_for :answers
7
7
  should_allow_mass_assignment_of :answers_attributes
8
8
 
9
+ context 'Looking up answers' do
10
+
11
+ setup do
12
+ @data_group = Factory(:data_group, :name => 'Physical Attributes')
13
+ @question1 = Factory(:question, :prompt => 'Hair Color', :data_group => @data_group)
14
+ @question2 = Factory(:question, :prompt => 'Weight', :data_type => 'Number', :data_group => @data_group)
15
+
16
+ @user = Factory(:user)
17
+ @user.answers << Factory(:answer, :question => @question1, :data => 'Brown')
18
+ @user.answers << Factory(:answer, :question => @question2, :data => '150')
19
+ end
20
+
21
+ context 'using auto-generated methods' do
22
+
23
+ should 'return string values for string data types' do
24
+ assert_equal 'Brown', @user.census_data.physical_attributes.hair_color
25
+ end
26
+
27
+ should 'return integer values for numeric data types' do
28
+ assert_equal 150, @user.census_data.physical_attributes.weight
29
+ end
30
+
31
+ end
32
+
33
+ context 'using data group and question strings' do
34
+
35
+ should 'return string values for string data types' do
36
+ assert_equal 'Brown', @user.census_data['Physical Attributes']['Hair Color']
37
+ end
38
+
39
+ should 'return integer values for numeric data types' do
40
+ assert_equal 150, @user.census_data['Physical Attributes']['Weight']
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
9
47
  end
@@ -6,6 +6,17 @@ Census.configure do |config|
6
6
  # config.admin_role = 'current_user.admin?'
7
7
  end
8
8
 
9
+ #
10
+ # Define data types. All data is stored in the database as strings, and you can
11
+ # provide procs that will be used to convert from the stored strings to any data
12
+ # type you need.
13
+ #
14
+ # :sql_transform - should return a SQL fragment that will be used for comparing
15
+ # data when doing search queries
16
+ # :format_data - is used to convert data from its string representation
17
+ # :validate_data - is used to validate form field submissions, and should return
18
+ # nil if the data is valid and an error message if it is invalid
19
+ #
9
20
  Census::DataType.define("String")
10
21
 
11
22
  Census::DataType.define(
@@ -14,9 +25,3 @@ Census::DataType.define(
14
25
  :format_data => lambda {|data| data.to_i unless data.blank? },
15
26
  :validate_data => lambda {|data| "must be a number" unless data =~ /^\d*$/}
16
27
  )
17
-
18
- Census::DataType.define(
19
- "Yes/No",
20
- :sql_transform => lambda {|column_name| "CAST(#{column_name} AS CHAR)"},
21
- :format_data => lambda {|data| %w(1 T t Y y).include?(data) unless data.blank? }
22
- )
@@ -9,7 +9,7 @@
9
9
  #
10
10
  # It's strongly recommended to check this file into your version control system.
11
11
 
12
- ActiveRecord::Schema.define(:version => 20100416173354) do
12
+ ActiveRecord::Schema.define(:version => 20100421154808) do
13
13
 
14
14
  create_table "answers", :force => true do |t|
15
15
  t.integer "question_id"
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 4
8
- - 0
9
- version: 0.4.0
8
+ - 1
9
+ version: 0.4.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Mark Kendall
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-16 00:00:00 -04:00
17
+ date: 2010-04-21 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -116,6 +116,7 @@ files:
116
116
  - lib/census/data_type.rb
117
117
  - lib/census/search.rb
118
118
  - lib/census/user.rb
119
+ - lib/census/user_data.rb
119
120
  - rails/init.rb
120
121
  - shoulda_macros/census.rb
121
122
  has_rdoc: true
@@ -171,7 +172,7 @@ test_files:
171
172
  - test/rails_root/config/initializers/new_rails_defaults.rb
172
173
  - test/rails_root/config/initializers/session_store.rb
173
174
  - test/rails_root/config/routes.rb
174
- - test/rails_root/db/migrate/20100416173354_create_census_tables.rb
175
+ - test/rails_root/db/migrate/20100421154808_create_census_tables.rb
175
176
  - test/rails_root/db/schema.rb
176
177
  - test/rails_root/test/factories/census.rb
177
178
  - test/rails_root/test/performance/browsing_test.rb