ransack 1.8.4 → 3.2.1
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.
- checksums.yaml +5 -5
- data/.github/FUNDING.yml +3 -0
- data/.github/SECURITY.md +12 -0
- data/.github/workflows/cronjob.yml +102 -0
- data/.github/workflows/deploy.yml +35 -0
- data/.github/workflows/rubocop.yml +20 -0
- data/.github/workflows/test-deploy.yml +29 -0
- data/.github/workflows/test.yml +130 -0
- data/.gitignore +3 -0
- data/{lib/ransack/adapters/mongoid/3.2/.gitkeep → .nojekyll} +0 -0
- data/.rubocop.yml +44 -0
- data/CHANGELOG.md +352 -0
- data/CONTRIBUTING.md +25 -13
- data/Gemfile +26 -27
- data/README.md +65 -815
- data/Rakefile +1 -22
- data/bug_report_templates/test-ransack-scope-and-column-same-name.rb +78 -0
- data/bug_report_templates/test-ransacker-arel-present-predicate.rb +71 -0
- data/docs/.gitignore +19 -0
- data/docs/.nojekyll +0 -0
- data/docs/babel.config.js +3 -0
- data/docs/blog/2022-03-27-ransack-3.0.0.md +20 -0
- data/docs/docs/getting-started/_category_.json +4 -0
- data/docs/docs/getting-started/advanced-mode.md +46 -0
- data/docs/docs/getting-started/configuration.md +47 -0
- data/docs/docs/getting-started/search-matches.md +67 -0
- data/docs/docs/getting-started/simple-mode.md +284 -0
- data/docs/docs/getting-started/sorting.md +79 -0
- data/docs/docs/getting-started/using-predicates.md +282 -0
- data/docs/docs/going-further/_category_.json +4 -0
- data/docs/docs/going-further/acts-as-taggable-on.md +114 -0
- data/docs/docs/going-further/associations.md +70 -0
- data/docs/docs/going-further/custom-predicates.md +52 -0
- data/docs/docs/going-further/documentation.md +43 -0
- data/docs/docs/going-further/exporting-to-csv.md +49 -0
- data/docs/docs/going-further/external-guides.md +57 -0
- data/docs/docs/going-further/form-customisation.md +63 -0
- data/docs/docs/going-further/i18n.md +53 -0
- data/docs/docs/going-further/img/create_release.png +0 -0
- data/docs/docs/going-further/merging-searches.md +41 -0
- data/docs/docs/going-further/other-notes.md +428 -0
- data/docs/docs/going-further/polymorphic-search.md +40 -0
- data/docs/docs/going-further/ransackers.md +331 -0
- data/docs/docs/going-further/release_process.md +36 -0
- data/docs/docs/going-further/saving-queries.md +82 -0
- data/docs/docs/going-further/searching-postgres.md +57 -0
- data/docs/docs/going-further/wiki-contributors.md +82 -0
- data/docs/docs/intro.md +99 -0
- data/docs/docusaurus.config.js +120 -0
- data/docs/package.json +38 -0
- data/docs/sidebars.js +31 -0
- data/docs/src/components/HomepageFeatures/index.js +64 -0
- data/docs/src/components/HomepageFeatures/styles.module.css +11 -0
- data/docs/src/css/custom.css +39 -0
- data/docs/src/pages/index.module.css +23 -0
- data/docs/src/pages/markdown-page.md +7 -0
- data/docs/static/.nojekyll +0 -0
- data/docs/static/img/docusaurus.png +0 -0
- data/docs/static/img/favicon.ico +0 -0
- data/docs/static/img/logo.svg +1 -0
- data/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
- data/docs/static/img/tutorial/localeDropdown.png +0 -0
- data/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- data/docs/static/img/undraw_docusaurus_react.svg +170 -0
- data/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- data/docs/static/logo/ransack-h.png +0 -0
- data/docs/static/logo/ransack-h.svg +34 -0
- data/docs/static/logo/ransack-v.png +0 -0
- data/docs/static/logo/ransack-v.svg +34 -0
- data/docs/static/logo/ransack.png +0 -0
- data/docs/static/logo/ransack.svg +21 -0
- data/docs/yarn.lock +8436 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/join_association.rb +70 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/join_dependency.rb +92 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/reflection.rb +11 -0
- data/lib/polyamorous/activerecord_7.0_ruby_2/join_association.rb +1 -0
- data/lib/polyamorous/activerecord_7.0_ruby_2/join_dependency.rb +1 -0
- data/lib/polyamorous/activerecord_7.0_ruby_2/reflection.rb +1 -0
- data/lib/polyamorous/activerecord_7.1_ruby_2/join_association.rb +1 -0
- data/lib/polyamorous/activerecord_7.1_ruby_2/join_dependency.rb +1 -0
- data/lib/polyamorous/activerecord_7.1_ruby_2/reflection.rb +1 -0
- data/lib/polyamorous/join.rb +70 -0
- data/lib/polyamorous/polyamorous.rb +24 -0
- data/lib/polyamorous/swapping_reflection_class.rb +11 -0
- data/lib/polyamorous/tree_node.rb +7 -0
- data/lib/polyamorous.rb +1 -0
- data/lib/ransack/adapters/active_record/base.rb +14 -3
- data/lib/ransack/adapters/active_record/context.rb +140 -196
- data/lib/ransack/adapters/active_record/ransack/constants.rb +19 -4
- data/lib/ransack/adapters/active_record/ransack/context.rb +9 -19
- data/lib/ransack/adapters/active_record/ransack/nodes/condition.rb +7 -7
- data/lib/ransack/adapters/active_record/ransack/translate.rb +1 -5
- data/lib/ransack/adapters/active_record/ransack/visitor.rb +23 -0
- data/lib/ransack/adapters/active_record.rb +0 -9
- data/lib/ransack/adapters.rb +2 -0
- data/lib/ransack/configuration.rb +52 -2
- data/lib/ransack/constants.rb +1 -5
- data/lib/ransack/context.rb +29 -24
- data/lib/ransack/helpers/form_builder.rb +12 -6
- data/lib/ransack/helpers/form_helper.rb +11 -3
- data/lib/ransack/helpers.rb +1 -1
- data/lib/ransack/locale/ar.yml +70 -0
- data/lib/ransack/locale/az.yml +70 -0
- data/lib/ransack/locale/bg.yml +70 -0
- data/lib/ransack/locale/ca.yml +70 -0
- data/lib/ransack/locale/el.yml +70 -0
- data/lib/ransack/locale/es.yml +22 -22
- data/lib/ransack/locale/fa.yml +70 -0
- data/lib/ransack/locale/fi.yml +71 -0
- data/lib/ransack/locale/nl.yml +4 -4
- data/lib/ransack/locale/ru.yml +70 -0
- data/lib/ransack/locale/sk.yml +70 -0
- data/lib/ransack/locale/sv.yml +70 -0
- data/lib/ransack/locale/tr.yml +70 -0
- data/lib/ransack/locale/zh-CN.yml +12 -12
- data/lib/ransack/nodes/attribute.rb +2 -2
- data/lib/ransack/nodes/condition.rb +7 -1
- data/lib/ransack/nodes/grouping.rb +3 -8
- data/lib/ransack/nodes/sort.rb +3 -3
- data/lib/ransack/nodes/value.rb +3 -3
- data/lib/ransack/predicate.rb +13 -20
- data/lib/ransack/search.rb +7 -4
- data/lib/ransack/translate.rb +115 -115
- data/lib/ransack/version.rb +1 -1
- data/lib/ransack/visitor.rb +1 -12
- data/lib/ransack.rb +7 -5
- data/ransack.gemspec +9 -25
- data/spec/blueprints/articles.rb +1 -1
- data/spec/blueprints/comments.rb +1 -1
- data/spec/blueprints/notes.rb +1 -1
- data/spec/blueprints/tags.rb +1 -1
- data/spec/console.rb +5 -5
- data/spec/helpers/polyamorous_helper.rb +13 -0
- data/spec/helpers/ransack_helper.rb +1 -1
- data/spec/polyamorous/activerecord_compatibility_spec.rb +15 -0
- data/spec/polyamorous/join_association_spec.rb +30 -0
- data/spec/polyamorous/join_dependency_spec.rb +81 -0
- data/spec/polyamorous/join_spec.rb +19 -0
- data/spec/ransack/adapters/active_record/base_spec.rb +105 -11
- data/spec/ransack/adapters/active_record/context_spec.rb +63 -24
- data/spec/ransack/configuration_spec.rb +24 -0
- data/spec/ransack/helpers/form_builder_spec.rb +3 -15
- data/spec/ransack/helpers/form_helper_spec.rb +135 -168
- data/spec/ransack/nodes/condition_spec.rb +13 -0
- data/spec/ransack/nodes/grouping_spec.rb +2 -2
- data/spec/ransack/nodes/value_spec.rb +115 -0
- data/spec/ransack/predicate_spec.rb +54 -2
- data/spec/ransack/search_spec.rb +266 -36
- data/spec/spec_helper.rb +14 -5
- data/spec/support/schema.rb +99 -21
- metadata +117 -187
- data/.travis.yml +0 -86
- data/lib/ransack/adapters/active_record/3.0/compat.rb +0 -179
- data/lib/ransack/adapters/active_record/3.0/context.rb +0 -203
- data/lib/ransack/adapters/active_record/3.1/context.rb +0 -212
- data/lib/ransack/adapters/active_record/3.2/context.rb +0 -44
- data/lib/ransack/adapters/active_record/compat.rb +0 -14
- data/lib/ransack/adapters/mongoid/attributes/attribute.rb +0 -37
- data/lib/ransack/adapters/mongoid/attributes/order_predications.rb +0 -17
- data/lib/ransack/adapters/mongoid/attributes/predications.rb +0 -141
- data/lib/ransack/adapters/mongoid/base.rb +0 -134
- data/lib/ransack/adapters/mongoid/context.rb +0 -212
- data/lib/ransack/adapters/mongoid/inquiry_hash.rb +0 -23
- data/lib/ransack/adapters/mongoid/ransack/constants.rb +0 -88
- data/lib/ransack/adapters/mongoid/ransack/context.rb +0 -60
- data/lib/ransack/adapters/mongoid/ransack/nodes/condition.rb +0 -27
- data/lib/ransack/adapters/mongoid/ransack/translate.rb +0 -13
- data/lib/ransack/adapters/mongoid/ransack/visitor.rb +0 -24
- data/lib/ransack/adapters/mongoid/table.rb +0 -35
- data/lib/ransack/adapters/mongoid.rb +0 -15
- data/spec/mongoid/adapters/mongoid/base_spec.rb +0 -314
- data/spec/mongoid/adapters/mongoid/context_spec.rb +0 -56
- data/spec/mongoid/configuration_spec.rb +0 -162
- data/spec/mongoid/dependencies_spec.rb +0 -8
- data/spec/mongoid/helpers/ransack_helper.rb +0 -11
- data/spec/mongoid/nodes/condition_spec.rb +0 -49
- data/spec/mongoid/nodes/grouping_spec.rb +0 -13
- data/spec/mongoid/predicate_spec.rb +0 -155
- data/spec/mongoid/search_spec.rb +0 -445
- data/spec/mongoid/support/mongoid.yml +0 -11
- data/spec/mongoid/support/schema.rb +0 -135
- data/spec/mongoid/translate_spec.rb +0 -14
- data/spec/mongoid_spec_helper.rb +0 -63
- data/spec/ransack/dependencies_spec.rb +0 -12
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module Polyamorous
|
|
2
|
+
module JoinAssociationExtensions
|
|
3
|
+
include SwappingReflectionClass
|
|
4
|
+
def self.prepended(base)
|
|
5
|
+
base.class_eval { attr_reader :join_type }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def initialize(reflection, children, polymorphic_class = nil, join_type = Arel::Nodes::InnerJoin)
|
|
9
|
+
@join_type = join_type
|
|
10
|
+
if polymorphic_class && ::ActiveRecord::Base > polymorphic_class
|
|
11
|
+
swapping_reflection_klass(reflection, polymorphic_class) do |reflection|
|
|
12
|
+
super(reflection, children)
|
|
13
|
+
self.reflection.options[:polymorphic] = true
|
|
14
|
+
end
|
|
15
|
+
else
|
|
16
|
+
super(reflection, children)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Same as #join_constraints, but instead of constructing tables from the
|
|
21
|
+
# given block, uses the ones passed
|
|
22
|
+
def join_constraints_with_tables(foreign_table, foreign_klass, join_type, alias_tracker, tables)
|
|
23
|
+
joins = []
|
|
24
|
+
chain = []
|
|
25
|
+
|
|
26
|
+
reflection.chain.each.with_index do |reflection, i|
|
|
27
|
+
table = tables[i]
|
|
28
|
+
|
|
29
|
+
@table ||= table
|
|
30
|
+
chain << [reflection, table]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# The chain starts with the target table, but we want to end with it here (makes
|
|
34
|
+
# more sense in this context), so we reverse
|
|
35
|
+
chain.reverse_each do |reflection, table|
|
|
36
|
+
klass = reflection.klass
|
|
37
|
+
|
|
38
|
+
join_scope = reflection.join_scope(table, foreign_table, foreign_klass)
|
|
39
|
+
|
|
40
|
+
unless join_scope.references_values.empty?
|
|
41
|
+
join_dependency = join_scope.construct_join_dependency(
|
|
42
|
+
join_scope.eager_load_values | join_scope.includes_values, Arel::Nodes::OuterJoin
|
|
43
|
+
)
|
|
44
|
+
join_scope.joins!(join_dependency)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
arel = join_scope.arel(alias_tracker.aliases)
|
|
48
|
+
nodes = arel.constraints.first
|
|
49
|
+
|
|
50
|
+
if nodes.is_a?(Arel::Nodes::And)
|
|
51
|
+
others = nodes.children.extract! do |node|
|
|
52
|
+
!Arel.fetch_attribute(node) { |attr| attr.relation.name == table.name }
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
joins << table.create_join(table, table.create_on(nodes), join_type)
|
|
57
|
+
|
|
58
|
+
if others && !others.empty?
|
|
59
|
+
joins.concat arel.join_sources
|
|
60
|
+
append_constraints(joins.last, others)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# The current table in this iteration becomes the foreign table in the next
|
|
64
|
+
foreign_table, foreign_klass = table, klass
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
joins
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module Polyamorous
|
|
2
|
+
module JoinDependencyExtensions
|
|
3
|
+
# Replaces ActiveRecord::Associations::JoinDependency#build
|
|
4
|
+
def build(associations, base_klass)
|
|
5
|
+
associations.map do |name, right|
|
|
6
|
+
if name.is_a? Join
|
|
7
|
+
reflection = find_reflection base_klass, name.name
|
|
8
|
+
reflection.check_validity!
|
|
9
|
+
reflection.check_eager_loadable!
|
|
10
|
+
|
|
11
|
+
klass = if reflection.polymorphic?
|
|
12
|
+
name.klass || base_klass
|
|
13
|
+
else
|
|
14
|
+
reflection.klass
|
|
15
|
+
end
|
|
16
|
+
JoinAssociation.new(reflection, build(right, klass), name.klass, name.type)
|
|
17
|
+
else
|
|
18
|
+
reflection = find_reflection base_klass, name
|
|
19
|
+
reflection.check_validity!
|
|
20
|
+
reflection.check_eager_loadable!
|
|
21
|
+
|
|
22
|
+
if reflection.polymorphic?
|
|
23
|
+
raise ActiveRecord::EagerLoadPolymorphicError.new(reflection)
|
|
24
|
+
end
|
|
25
|
+
JoinAssociation.new(reflection, build(right, reflection.klass))
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def join_constraints(joins_to_add, alias_tracker, references)
|
|
31
|
+
@alias_tracker = alias_tracker
|
|
32
|
+
@joined_tables = {}
|
|
33
|
+
@references = {}
|
|
34
|
+
|
|
35
|
+
references.each do |table_name|
|
|
36
|
+
@references[table_name.to_sym] = table_name if table_name.is_a?(String)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
joins = make_join_constraints(join_root, join_type)
|
|
40
|
+
|
|
41
|
+
joins.concat joins_to_add.flat_map { |oj|
|
|
42
|
+
if join_root.match?(oj.join_root) && join_root.table.name == oj.join_root.table.name
|
|
43
|
+
walk join_root, oj.join_root, oj.join_type
|
|
44
|
+
else
|
|
45
|
+
make_join_constraints(oj.join_root, oj.join_type)
|
|
46
|
+
end
|
|
47
|
+
}
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def construct_tables_for_association!(join_root, association)
|
|
51
|
+
tables = table_aliases_for(join_root, association)
|
|
52
|
+
association.table = tables.first
|
|
53
|
+
tables
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def table_aliases_for(parent, node)
|
|
59
|
+
node.reflection.chain.map { |reflection|
|
|
60
|
+
alias_tracker.aliased_table_for(reflection.klass.arel_table) do
|
|
61
|
+
root = reflection == node.reflection
|
|
62
|
+
name = reflection.alias_candidate(parent.table_name)
|
|
63
|
+
root ? name : "#{name}_join"
|
|
64
|
+
end
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
module ClassMethods
|
|
69
|
+
# Prepended before ActiveRecord::Associations::JoinDependency#walk_tree
|
|
70
|
+
#
|
|
71
|
+
def walk_tree(associations, hash)
|
|
72
|
+
case associations
|
|
73
|
+
when TreeNode
|
|
74
|
+
associations.add_to_tree(hash)
|
|
75
|
+
when Hash
|
|
76
|
+
associations.each do |k, v|
|
|
77
|
+
cache =
|
|
78
|
+
if TreeNode === k
|
|
79
|
+
k.add_to_tree(hash)
|
|
80
|
+
else
|
|
81
|
+
hash[k] ||= {}
|
|
82
|
+
end
|
|
83
|
+
walk_tree(v, cache)
|
|
84
|
+
end
|
|
85
|
+
else
|
|
86
|
+
super(associations, hash)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'polyamorous/activerecord_6.1_ruby_2/join_association'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'polyamorous/activerecord_6.1_ruby_2/join_dependency'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'polyamorous/activerecord_6.1_ruby_2/reflection'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'polyamorous/activerecord_6.1_ruby_2/join_association'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'polyamorous/activerecord_6.1_ruby_2/join_dependency'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'polyamorous/activerecord_6.1_ruby_2/reflection'
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module Polyamorous
|
|
2
|
+
class Join
|
|
3
|
+
include TreeNode
|
|
4
|
+
|
|
5
|
+
attr_accessor :name
|
|
6
|
+
attr_reader :type, :klass
|
|
7
|
+
|
|
8
|
+
def initialize(name, type = InnerJoin, klass = nil)
|
|
9
|
+
@name = name
|
|
10
|
+
@type = convert_to_arel_join_type(type)
|
|
11
|
+
@klass = convert_to_class(klass) if klass
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def klass=(klass)
|
|
15
|
+
@klass = convert_to_class(klass) if klass
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def type=(type)
|
|
19
|
+
@type = convert_to_arel_join_type(type) if type
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def hash
|
|
23
|
+
[@name, @type, @klass].hash
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def eql?(other)
|
|
27
|
+
self.class == other.class &&
|
|
28
|
+
self.name == other.name &&
|
|
29
|
+
self.type == other.type &&
|
|
30
|
+
self.klass == other.klass
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
alias :== :eql?
|
|
34
|
+
|
|
35
|
+
def add_to_tree(hash)
|
|
36
|
+
hash[self] ||= {}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def convert_to_arel_join_type(type)
|
|
42
|
+
case type
|
|
43
|
+
when 'inner', :inner
|
|
44
|
+
InnerJoin
|
|
45
|
+
when 'outer', :outer
|
|
46
|
+
OuterJoin
|
|
47
|
+
when Class
|
|
48
|
+
if [InnerJoin, OuterJoin].include? type
|
|
49
|
+
type
|
|
50
|
+
else
|
|
51
|
+
raise ArgumentError, "#{type} cannot be converted to an ARel join type"
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
raise ArgumentError, "#{type} cannot be converted to an ARel join type"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def convert_to_class(value)
|
|
59
|
+
case value
|
|
60
|
+
when String, Symbol
|
|
61
|
+
Kernel.const_get(value)
|
|
62
|
+
when Class
|
|
63
|
+
value
|
|
64
|
+
else
|
|
65
|
+
raise ArgumentError, "#{value} cannot be converted to a Class"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
if defined?(::ActiveRecord)
|
|
2
|
+
module Polyamorous
|
|
3
|
+
InnerJoin = Arel::Nodes::InnerJoin
|
|
4
|
+
OuterJoin = Arel::Nodes::OuterJoin
|
|
5
|
+
|
|
6
|
+
JoinDependency = ::ActiveRecord::Associations::JoinDependency
|
|
7
|
+
JoinAssociation = ::ActiveRecord::Associations::JoinDependency::JoinAssociation
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
require 'polyamorous/tree_node'
|
|
11
|
+
require 'polyamorous/join'
|
|
12
|
+
require 'polyamorous/swapping_reflection_class'
|
|
13
|
+
|
|
14
|
+
ar_version = ::ActiveRecord::VERSION::STRING[0, 3]
|
|
15
|
+
%w(join_association join_dependency reflection).each do |file|
|
|
16
|
+
require "polyamorous/activerecord_#{ar_version}_ruby_2/#{file}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
ActiveRecord::Reflection::AbstractReflection.send(:prepend, Polyamorous::ReflectionExtensions)
|
|
20
|
+
|
|
21
|
+
Polyamorous::JoinDependency.send(:prepend, Polyamorous::JoinDependencyExtensions)
|
|
22
|
+
Polyamorous::JoinDependency.singleton_class.send(:prepend, Polyamorous::JoinDependencyExtensions::ClassMethods)
|
|
23
|
+
Polyamorous::JoinAssociation.send(:prepend, Polyamorous::JoinAssociationExtensions)
|
|
24
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module Polyamorous
|
|
2
|
+
module SwappingReflectionClass
|
|
3
|
+
def swapping_reflection_klass(reflection, klass)
|
|
4
|
+
new_reflection = reflection.clone
|
|
5
|
+
new_reflection.instance_variable_set(:@options, reflection.options.clone)
|
|
6
|
+
new_reflection.options.delete(:polymorphic)
|
|
7
|
+
new_reflection.instance_variable_set(:@klass, klass)
|
|
8
|
+
yield new_reflection
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
data/lib/polyamorous.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'polyamorous/polyamorous'
|
|
@@ -4,7 +4,6 @@ module Ransack
|
|
|
4
4
|
module Base
|
|
5
5
|
|
|
6
6
|
def self.extended(base)
|
|
7
|
-
alias :search :ransack unless base.respond_to? :search
|
|
8
7
|
base.class_eval do
|
|
9
8
|
class_attribute :_ransackers
|
|
10
9
|
class_attribute :_ransack_aliases
|
|
@@ -17,6 +16,10 @@ module Ransack
|
|
|
17
16
|
Search.new(self, params, options)
|
|
18
17
|
end
|
|
19
18
|
|
|
19
|
+
def ransack!(params = {}, options = {})
|
|
20
|
+
ransack(params, options.merge(ignore_unknown_conditions: false))
|
|
21
|
+
end
|
|
22
|
+
|
|
20
23
|
def ransacker(name, opts = {}, &block)
|
|
21
24
|
self._ransackers = _ransackers.merge name.to_s => Ransacker
|
|
22
25
|
.new(self, name, opts, &block)
|
|
@@ -32,7 +35,7 @@ module Ransack
|
|
|
32
35
|
# For overriding with a whitelist array of strings.
|
|
33
36
|
#
|
|
34
37
|
def ransackable_attributes(auth_object = nil)
|
|
35
|
-
if Ransack::SUPPORTS_ATTRIBUTE_ALIAS
|
|
38
|
+
@ransackable_attributes ||= if Ransack::SUPPORTS_ATTRIBUTE_ALIAS
|
|
36
39
|
column_names + _ransackers.keys + _ransack_aliases.keys +
|
|
37
40
|
attribute_aliases.keys
|
|
38
41
|
else
|
|
@@ -45,7 +48,7 @@ module Ransack
|
|
|
45
48
|
# For overriding with a whitelist array of strings.
|
|
46
49
|
#
|
|
47
50
|
def ransackable_associations(auth_object = nil)
|
|
48
|
-
reflect_on_all_associations.map { |a| a.name.to_s }
|
|
51
|
+
@ransackable_associations ||= reflect_on_all_associations.map { |a| a.name.to_s }
|
|
49
52
|
end
|
|
50
53
|
|
|
51
54
|
# Ransortable_attributes, by default, returns the names
|
|
@@ -64,6 +67,14 @@ module Ransack
|
|
|
64
67
|
[]
|
|
65
68
|
end
|
|
66
69
|
|
|
70
|
+
# ransack_scope_skip_sanitize_args, by default, returns an empty array.
|
|
71
|
+
# i.e. use the sanitize_scope_args setting to determine if args should be converted.
|
|
72
|
+
# For overriding with a list of scopes which should be passed the args as-is.
|
|
73
|
+
#
|
|
74
|
+
def ransackable_scopes_skip_sanitize_args
|
|
75
|
+
[]
|
|
76
|
+
end
|
|
77
|
+
|
|
67
78
|
end
|
|
68
79
|
end
|
|
69
80
|
end
|