Skip to content

Commit

Permalink
add scopes for ordering
Browse files Browse the repository at this point in the history
  • Loading branch information
ajb committed Dec 28, 2013
1 parent d9a0c25 commit 910d347
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 0 deletions.
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ gemspec

# Explicitly require gems
gem 'carrierwave', require: 'carrierwave'
gem 'database_cleaner', require: 'database_cleaner'
gem 'geocoder', require: 'geocoder'

# Declare any dependencies that are still in development here instead of in
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ GEM
term-ansicolor
thor
daemons (1.1.9)
database_cleaner (1.2.0)
diff-lcs (1.2.4)
erubis (2.7.0)
eventmachine (1.0.3)
Expand Down Expand Up @@ -183,6 +184,7 @@ DEPENDENCIES
capybara
carrierwave
coveralls
database_cleaner
factory_girl_rails
formbuilder-rb!
geocoder
Expand Down
1 change: 1 addition & 0 deletions formbuilder-rb.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Gem::Specification.new do |s|
s.add_dependency 'rmagick'

s.add_development_dependency 'capybara'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'factory_girl_rails'
s.add_development_dependency 'guard-rspec'
s.add_development_dependency 'launchy'
Expand Down
16 changes: 16 additions & 0 deletions lib/formbuilder/entry.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,22 @@ module Entry
before_validation :normalize_responses
validates_with Formbuilder::EntryValidator
before_save :calculate_responses_text, if: :responses_changed?

scope :order_by_response_field_value, -> (response_field, direction) {
if response_field.sort_as_numeric
order("(responses -> '#{response_field.id}_sortable_value') ::numeric #{direction} NULLS LAST")
else
order("LOWER(responses -> '#{response_field.id}_sortable_value') #{direction} NULLS LAST")
end
}

scope :order_by_response_field_checkbox_value, -> (response_field, option, direction) {
order("(CASE WHEN (responses -> '#{response_field.id}_sortable_values_#{option}') = 'true' THEN
1
ELSE
0
END) #{direction}".squish)
}
end

def value_present?(response_field)
Expand Down
36 changes: 36 additions & 0 deletions spec/lib/formbuilder/entry_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,42 @@ def file_value
e2 = create_entry('aaaBBB')
ensure_sort_order(e1, e2)
end


describe 'scopes' do
before { entry.destroy }

describe 'scope :order_by_response_field_value' do
it 'functions for numeric fields' do
first_response_field.update_attributes(type: 'Formbuilder::ResponseFieldPrice')
e1 = create_entry({ 'dollars' => '05', 'cents' => '02' })
e2 = create_entry({ 'dollars' => '09', 'cents' => '1' })
Entry.order_by_response_field_value(first_response_field, 'desc').should == [e2, e1]
Entry.order_by_response_field_value(first_response_field, 'asc').should == [e1, e2]
end

it 'functions for text fields' do
first_response_field.update_attributes(type: 'Formbuilder::ResponseFieldText')
e1 = create_entry('aaaa')
e2 = create_entry('b')
Entry.order_by_response_field_value(first_response_field, 'desc').should == [e2, e1]
Entry.order_by_response_field_value(first_response_field, 'asc').should == [e1, e2]
end
end

describe 'scope :order_by_response_field_checkbox_value' do
it 'functions properly' do
first_response_field.update_attributes(type: 'Formbuilder::ResponseFieldCheckboxes',
field_options: { 'options' => [{'checked' => 'false', 'label' => 'Choice #1'}] })

e1 = create_entry({ '0' => 'on' })
e2 = create_entry({})

Entry.order_by_response_field_checkbox_value(first_response_field, 'Choice #1', 'desc').should == [e1, e2]
Entry.order_by_response_field_checkbox_value(first_response_field, 'Choice #1', 'asc').should == [e2, e1]
end
end
end
end

end
21 changes: 21 additions & 0 deletions spec/support/database_cleaner.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end

config.before(:each) do
DatabaseCleaner.strategy = :transaction
end

config.before(:each, :js => true) do
DatabaseCleaner.strategy = :truncation
end

config.before(:each) do
DatabaseCleaner.start
end

config.after(:each) do
DatabaseCleaner.clean
end
end

0 comments on commit 910d347

Please sign in to comment.