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 +58 -0
- data/lib/facet_for/version.rb +1 -1
- data/lib/facet_for.rb +11 -6
- metadata +7 -7
- data/README.textile +0 -8
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'```.
|
data/lib/facet_for/version.rb
CHANGED
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,
|
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 #{
|
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 #{
|
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
|
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-
|
12
|
+
date: 2012-01-09 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ransack
|
16
|
-
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: *
|
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.
|
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:
|
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:
|
64
|
+
hash: 432141005
|
65
65
|
requirements: []
|
66
66
|
rubyforge_project: facet_for
|
67
67
|
rubygems_version: 1.8.10
|
data/README.textile
DELETED