facet_for 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # facet_for
2
+
3
+ facet_for is a collection of FormBuilder helpers that speed up the process of creating complex search forms with [Ransack](http://github.com/ernie/ransack).
4
+
5
+ For many searches, it can be as simple as:
6
+
7
+ ```ruby
8
+ <%= f.facet_for(:field_name) -%>
9
+ ```
10
+
11
+ facet_for will use the database column type to choose an appropriate Ransack predicate, then create both the label and field. It will also work for ```has_many``` and ```belongs_to``` associations.
12
+
13
+ ## Installation
14
+
15
+ Add ```gem 'facet_for'``` in your Gemfile
16
+
17
+ ## Options
18
+
19
+ Many options in facet_for can be overridden by passing hash options.
20
+
21
+ ### Predicates
22
+
23
+ To choose an alternate predicate, pass ```:type => :predicate```.
24
+
25
+ Most of the Ransack predicates are supported:
26
+
27
+ * Contains - ```:type => :cont```
28
+ * Doesn't Contain - ```:type => :not_cont```
29
+ * Starts With - ```:type => :start```
30
+ * Doesn't Start With - ```:type => :not_start```
31
+ * Ends With - ```:type => :end```
32
+ * Doesn't End With - ```:type => :not_end```
33
+ * Is Null - ```:type => :null```
34
+ * Is Not Null - ```:type => :not_null```
35
+ * True - ```:type => :true```
36
+ * False - ```:type => :false```
37
+ * Greater Than or Equal - ```:type => :gte```
38
+ * Less Than or Equal - ```:type => :lte```
39
+
40
+ As well as several special cases and meta-predicates specific to facet_for:
41
+
42
+ #### Collections
43
+
44
+ * Collection - ```:type => :collection```
45
+
46
+ By default, when passing a ```has_many``` or ```belongs_to``` association into facet_for, it will choose the ```:collection``` predicate. This produces a ```collection_select``` with the unique options for that association.
47
+
48
+ When using ```:type => :collection``` on a column in the database, rather than an association, it defaults to all unique options.
49
+
50
+ To pass specific options, use ```:collection => []``` to pass an array of options. This may either be a flat array of strings (eg ```['Blue', 'Red', 'Green']), a flat array of objects (```SomeModel.all```), or a nested array of name and value pairs.
51
+
52
+ * Contains Any - ```:type => :cont_any```
53
+
54
+ ```:type => :cont_any``` behaves in a nearly identical manner to ```:type => :collection```, except that the collection is rendered as a series of check boxes rather than a ```collection_select```.
55
+
56
+ ### Custom Labels
57
+
58
+ By default, facet_for will determine label text based on a combination of the field name and the predicate. This can be overwritten by specifying ```:label => 'Your Label Here'```.
@@ -1,3 +1,3 @@
1
1
  module FacetFor
2
- VERSION = "0.0.8"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/facet_for.rb CHANGED
@@ -37,7 +37,8 @@ module FacetFor
37
37
 
38
38
  q.context.searchable_associations.each do |association|
39
39
  association_model = association.camelcase.singularize.constantize
40
- column_options.push([association_model.to_s, options_for_model(association_model, association)])
40
+ column_options.push([association_model.to_s,
41
+ options_for_model(association_model, association)])
41
42
  end
42
43
 
43
44
  column_options
@@ -96,13 +97,13 @@ module FacetFor
96
97
  x.primary_key_name == @facet[:column_name].to_s }.uniq and association.count > 0
97
98
 
98
99
  if association.first.macro == :has_many
99
-
100
100
  # For a has_many relationship, we want the plural name with _id.
101
101
  # Ransack will then look at the _id column for the associated model.
102
102
  # This won't work properly on models with nonstandard id column
103
103
  # names. That's a problem, but whatevs for the time being.
104
104
  @facet[:association_name] = "#{association.first.plural_name}"
105
105
  @facet[:column_name] = "#{association.first.plural_name}_id"
106
+ @facet[:clean_column_name] = "#{association.first.name.to_s.singularize}_id"
106
107
 
107
108
  elsif association.first.macro == :belongs_to
108
109
 
@@ -121,11 +122,11 @@ module FacetFor
121
122
  @facet[:type] = @facet[:type] || :collection
122
123
 
123
124
  # If the user hasn't specified a collection, we'll provide one now
124
- # based on this association
125
+ # based on this association. We only want to use distinct values.
126
+ # This could probably be cleaner, but it works.
125
127
 
126
- @facet[:collection] = @facet[:model].joins(@facet[:association_name].to_sym).select("DISTINCT #{@facet[:column_name]}").where("#{@facet[:column_name]} IS NOT NULL").map { |m| m.send(@facet[:association_name].to_sym) }
128
+ @facet[:collection] = @facet[:model].unscoped.joins(@facet[:association_name].to_sym).select("DISTINCT #{clean_column}").where("#{clean_column} IS NOT NULL").map { |m| @facet[:association_name].to_s.singularize.camelcase.constantize.find(m.send(clean_column)) }
127
129
 
128
- # @facet[:collection] = @facet[:collection] || association.first.klass.all
129
130
  end
130
131
  else
131
132
 
@@ -349,8 +350,12 @@ module FacetFor
349
350
 
350
351
  end
351
352
 
353
+ def clean_column
354
+ @facet[:clean_column_name] || @facet[:column_name]
355
+ end
356
+
352
357
  def unique_value_collection
353
- @facet[:collection] = @facet[:model].select("DISTINCT #{@facet[:column_name]}").where("#{@facet[:column_name]} IS NOT NULL").map { |m| m.send(@facet[:column_name]) }
358
+ @facet[:collection] = @facet[:model].unscoped.select("DISTINCT #{clean_column}").where("#{clean_column} IS NOT NULL").map { |m| m.send(@facet[:column_name]) }
354
359
  end
355
360
 
356
361
  def label(string_name, string_label = nil)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facet_for
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-06 00:00:00.000000000Z
12
+ date: 2012-01-09 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ransack
16
- requirement: &78616160 !ruby/object:Gem::Requirement
16
+ requirement: &84788010 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *78616160
24
+ version_requirements: *84788010
25
25
  description: Provides helpers for creating search forms with Ransack
26
26
  email:
27
27
  - jbarket@sleepunit.com
@@ -31,7 +31,7 @@ extra_rdoc_files: []
31
31
  files:
32
32
  - .gitignore
33
33
  - Gemfile
34
- - README.textile
34
+ - README.md
35
35
  - Rakefile
36
36
  - facet_for.gemspec
37
37
  - lib/facet_for.rb
@@ -52,7 +52,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
52
52
  version: '0'
53
53
  segments:
54
54
  - 0
55
- hash: -507125603
55
+ hash: 432141005
56
56
  required_rubygems_version: !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
@@ -61,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  version: '0'
62
62
  segments:
63
63
  - 0
64
- hash: -507125603
64
+ hash: 432141005
65
65
  requirements: []
66
66
  rubyforge_project: facet_for
67
67
  rubygems_version: 1.8.10
data/README.textile DELETED
@@ -1,8 +0,0 @@
1
- h1. facet_for
2
-
3
- facet_for is a collection of FormBuilder helpers that speed up the process of
4
- creating complex search forms with "Ransack":http://github.com/ernie/ransack
5
-
6
- h2. Installation
7
-
8
- Simply include 'facet_for' in your Gemfile