ransack 2.0.1 → 2.1.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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +0 -5
- data/CHANGELOG.md +51 -0
- data/README.md +56 -4
- data/lib/polyamorous.rb +6 -23
- data/lib/ransack/adapters/active_record/base.rb +1 -0
- data/lib/ransack/adapters/active_record/context.rb +27 -13
- data/lib/ransack/adapters/active_record/ransack/visitor.rb +8 -4
- data/lib/ransack/locale/ar.yml +70 -0
- data/lib/ransack/locale/bg.yml +70 -0
- data/lib/ransack/locale/el.yml +70 -0
- data/lib/ransack/locale/zh-CN.yml +12 -12
- data/lib/ransack/version.rb +1 -1
- data/logo/ransack-h.png +0 -0
- data/logo/ransack-h.svg +34 -0
- data/logo/ransack-v.png +0 -0
- data/logo/ransack-v.svg +34 -0
- data/logo/ransack.png +0 -0
- data/logo/ransack.svg +21 -0
- data/spec/ransack/adapters/active_record/base_spec.rb +11 -4
- data/spec/ransack/helpers/form_helper_spec.rb +51 -51
- data/spec/support/schema.rb +3 -0
- metadata +11 -3
- data/lib/ransack/adapters/active_record/compat.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2eab955e89328399bcb163a575725ea51969653edb1edd66773b6f60554fd12
|
4
|
+
data.tar.gz: 1e6d34f5d87238a18c7ae2194cd0d5320d9460b97b8d8c30ec79d82de6aa139a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52c4a46725d9bb474fbb229c39d9638c730d77bd53211f00f639b78690fcd72aaaa2418b56704c30024c36c39ca7cebde0e86b76cba13704a26f4416791ad141
|
7
|
+
data.tar.gz: bd6880992a977511ea37df47d0828e8ee1e855dff39e2620eaed89bc043ffde2960e3006ebcc0609c9738af10faea6947a1db1f91f1f3eebc65b631d97137054
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -4,7 +4,6 @@ sudo: false
|
|
4
4
|
|
5
5
|
rvm:
|
6
6
|
- 2.5
|
7
|
-
- 2.2
|
8
7
|
|
9
8
|
env:
|
10
9
|
- RAILS=5-2-stable DB=sqlite3
|
@@ -23,10 +22,6 @@ env:
|
|
23
22
|
- RAILS=5-1-stable DB=mysql
|
24
23
|
- RAILS=5-1-stable DB=postgres
|
25
24
|
|
26
|
-
- RAILS=5-0-stable DB=sqlite3
|
27
|
-
- RAILS=5-0-stable DB=mysql
|
28
|
-
- RAILS=5-0-stable DB=postgres
|
29
|
-
|
30
25
|
matrix:
|
31
26
|
allow_failures:
|
32
27
|
- env: RAILS=5-2-stable DB=sqlite3
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,57 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## Version 2.1.1 - 2018-12-05
|
6
|
+
|
7
|
+
* Add `arabic` translation
|
8
|
+
https://github.com/activerecord-hackery/ransack/pull/979
|
9
|
+
|
10
|
+
* Deprecate #search
|
11
|
+
PR [975](https://github.com/activerecord-hackery/ransack/pull/975)
|
12
|
+
|
13
|
+
## Version 2.1.0 - 2018-10-26
|
14
|
+
|
15
|
+
* Add support for sorting by scopes
|
16
|
+
PR [973](https://github.com/activerecord-hackery/ransack/pull/973)
|
17
|
+
|
18
|
+
*Diego Borges*
|
19
|
+
|
20
|
+
* Added a new logo for Ransack
|
21
|
+
PR [972](https://github.com/activerecord-hackery/ransack/pull/972)
|
22
|
+
|
23
|
+
*Anıl Kılıç*, *Greg Molnar*
|
24
|
+
|
25
|
+
* Greek translations
|
26
|
+
PR [971](https://github.com/activerecord-hackery/ransack/pull/971)
|
27
|
+
PR [960](https://github.com/activerecord-hackery/ransack/pull/960)
|
28
|
+
|
29
|
+
*Sean Carroll*, *Greg Molnar*
|
30
|
+
|
31
|
+
* README improvements
|
32
|
+
PR [963](https://github.com/activerecord-hackery/ransack/pull/963)
|
33
|
+
|
34
|
+
*tommaso1*
|
35
|
+
|
36
|
+
* Bulgarian translations
|
37
|
+
PR [961](https://github.com/activerecord-hackery/ransack/pull/961)
|
38
|
+
|
39
|
+
*Sean Carroll*
|
40
|
+
|
41
|
+
* README improvements
|
42
|
+
PR [956](https://github.com/activerecord-hackery/ransack/pull/956)
|
43
|
+
|
44
|
+
*Alex Konoval*
|
45
|
+
|
46
|
+
* Remove lib/ransack/adapters/active_record/compat.rb
|
47
|
+
PR [954](https://github.com/activerecord-hackery/ransack/pull/954)
|
48
|
+
|
49
|
+
*Ryuta Kamizono*
|
50
|
+
|
51
|
+
* Remove unused aliases
|
52
|
+
PR [953](https://github.com/activerecord-hackery/ransack/pull/953)
|
53
|
+
|
54
|
+
*Ryuta Kamizono*
|
55
|
+
|
5
56
|
## Version 2.0.1 - 2018-08-18
|
6
57
|
|
7
58
|
* Don't return association if table is nil
|
data/README.md
CHANGED
@@ -1,15 +1,16 @@
|
|
1
|
-
# Ransack
|
1
|
+
# 
|
2
2
|
|
3
3
|
[](https://travis-ci.org/activerecord-hackery/ransack)
|
4
4
|
[](http://badge.fury.io/rb/ransack)
|
5
5
|
[](https://codeclimate.com/github/activerecord-hackery/ransack)
|
6
|
+
[](#backers) [](#sponsors)
|
6
7
|
|
7
8
|
Ransack is a rewrite of [MetaSearch](https://github.com/activerecord-hackery/meta_search)
|
8
9
|
created by [Ernie Miller](http://twitter.com/erniemiller)
|
9
10
|
and developed/maintained for years by
|
10
11
|
[Jon Atack](http://twitter.com/jonatack) and
|
11
12
|
[Ryan Bigg](http://twitter.com/ryanbigg) with the help of a great group of
|
12
|
-
[contributors](https://github.com/activerecord-hackery/ransack/graphs/contributors).
|
13
|
+
[contributors](https://github.com/activerecord-hackery/ransack/graphs/contributors). Ransack's logo is designed by [Anıl Kılıç](https://github.com/anilkilic).
|
13
14
|
While it supports many of the same features as MetaSearch, its underlying
|
14
15
|
implementation differs greatly from MetaSearch,
|
15
16
|
and backwards compatibility is not a design goal.
|
@@ -132,6 +133,11 @@ which are defined in
|
|
132
133
|
<% end %>
|
133
134
|
```
|
134
135
|
|
136
|
+
The argument of `f.search_field` has to be in this form:
|
137
|
+
`attribute_name[_or_attribute_name]..._predicate`
|
138
|
+
|
139
|
+
where `[_or_another_attribute_name]...` means any repetition of `_or_` plus the name of the attribute.
|
140
|
+
|
135
141
|
`cont` (contains) and `start` (starts with) are just two of the available
|
136
142
|
search predicates. See
|
137
143
|
[Constants](https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/constants.rb)
|
@@ -196,6 +202,23 @@ This example toggles the sort directions of both fields, by default
|
|
196
202
|
initially sorting the `last_name` field by ascending order, and the
|
197
203
|
`first_name` field by descending order.
|
198
204
|
|
205
|
+
In the case that you wish to sort by some complex value, such as the result
|
206
|
+
of a SQL function, you may do so using scopes. In your model, define scopes
|
207
|
+
whose names line up with the name of the virtual field you wish to sort by,
|
208
|
+
as so:
|
209
|
+
|
210
|
+
```ruby
|
211
|
+
class Person < ActiveRecord::Base
|
212
|
+
scope :sort_by_reverse_name_asc, lambda { order("REVERSE(name) ASC") }
|
213
|
+
scope :sort_by_reverse_name_desc, lambda { order("REVERSE(name) DESC") }
|
214
|
+
...
|
215
|
+
```
|
216
|
+
|
217
|
+
and you can then sort by this virtual field:
|
218
|
+
|
219
|
+
```erb
|
220
|
+
<%= sort_link(@q, :reverse_name) %>
|
221
|
+
```
|
199
222
|
|
200
223
|
The sort link order indicator arrows may be globally customized by setting a
|
201
224
|
`custom_arrows` option in an initializer file like
|
@@ -483,7 +506,7 @@ avoid returning duplicate rows, even if conditions on a join would otherwise
|
|
483
506
|
result in some. It generates the same SQL as calling `uniq` on the relation.
|
484
507
|
|
485
508
|
Please note that for many databases, a sort on an associated table's columns
|
486
|
-
may result in invalid SQL with `distinct: true` -- in those cases, you
|
509
|
+
may result in invalid SQL with `distinct: true` -- in those cases, you
|
487
510
|
will need to modify the result as needed to allow these queries to work.
|
488
511
|
|
489
512
|
For example, you could call joins and includes on the result which has the
|
@@ -722,7 +745,7 @@ Ransack.configure do |c|
|
|
722
745
|
end
|
723
746
|
```
|
724
747
|
|
725
|
-
To turn this off on a per-scope basis Ransack adds the following method to
|
748
|
+
To turn this off on a per-scope basis Ransack adds the following method to
|
726
749
|
`ActiveRecord::Base` that you can redefine to selectively override sanitization:
|
727
750
|
|
728
751
|
`ransackable_scopes_skip_sanitize_args`
|
@@ -911,3 +934,32 @@ directly related to bug reports, pull requests, or documentation improvements.
|
|
911
934
|
* Spread the word on Twitter, Facebook, and elsewhere if Ransack's been useful
|
912
935
|
to you. The more people who are using the project, the quicker we can find and
|
913
936
|
fix bugs!
|
937
|
+
|
938
|
+
## Contributors
|
939
|
+
|
940
|
+
This project exists thanks to all the people who contribute. <img src="https://opencollective.com/ransack/contributors.svg?width=890&button=false" />
|
941
|
+
|
942
|
+
|
943
|
+
## Backers
|
944
|
+
|
945
|
+
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/ransack#backer)]
|
946
|
+
|
947
|
+
<a href="https://opencollective.com/ransack#backers" target="_blank"><img src="https://opencollective.com/ransack/backers.svg?width=890"></a>
|
948
|
+
|
949
|
+
|
950
|
+
## Sponsors
|
951
|
+
|
952
|
+
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/ransack#sponsor)]
|
953
|
+
|
954
|
+
<a href="https://opencollective.com/ransack/sponsor/0/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/0/avatar.svg"></a>
|
955
|
+
<a href="https://opencollective.com/ransack/sponsor/1/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/1/avatar.svg"></a>
|
956
|
+
<a href="https://opencollective.com/ransack/sponsor/2/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/2/avatar.svg"></a>
|
957
|
+
<a href="https://opencollective.com/ransack/sponsor/3/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/3/avatar.svg"></a>
|
958
|
+
<a href="https://opencollective.com/ransack/sponsor/4/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/4/avatar.svg"></a>
|
959
|
+
<a href="https://opencollective.com/ransack/sponsor/5/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/5/avatar.svg"></a>
|
960
|
+
<a href="https://opencollective.com/ransack/sponsor/6/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/6/avatar.svg"></a>
|
961
|
+
<a href="https://opencollective.com/ransack/sponsor/7/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/7/avatar.svg"></a>
|
962
|
+
<a href="https://opencollective.com/ransack/sponsor/8/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/8/avatar.svg"></a>
|
963
|
+
<a href="https://opencollective.com/ransack/sponsor/9/website" target="_blank"><img src="https://opencollective.com/ransack/sponsor/9/avatar.svg"></a>
|
964
|
+
|
965
|
+
|
data/lib/polyamorous.rb
CHANGED
@@ -1,22 +1,10 @@
|
|
1
1
|
if defined?(::ActiveRecord)
|
2
2
|
module Polyamorous
|
3
|
-
|
4
|
-
|
5
|
-
OuterJoin = Arel::OuterJoin
|
6
|
-
else
|
7
|
-
InnerJoin = Arel::Nodes::InnerJoin
|
8
|
-
OuterJoin = Arel::Nodes::OuterJoin
|
9
|
-
end
|
3
|
+
InnerJoin = Arel::Nodes::InnerJoin
|
4
|
+
OuterJoin = Arel::Nodes::OuterJoin
|
10
5
|
|
11
|
-
|
12
|
-
|
13
|
-
JoinAssociation = ::ActiveRecord::Associations::JoinDependency::JoinAssociation
|
14
|
-
JoinBase = ::ActiveRecord::Associations::JoinDependency::JoinBase
|
15
|
-
else
|
16
|
-
JoinDependency = ::ActiveRecord::Associations::ClassMethods::JoinDependency
|
17
|
-
JoinAssociation = ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation
|
18
|
-
JoinBase = ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinBase
|
19
|
-
end
|
6
|
+
JoinDependency = ::ActiveRecord::Associations::JoinDependency
|
7
|
+
JoinAssociation = ::ActiveRecord::Associations::JoinDependency::JoinAssociation
|
20
8
|
end
|
21
9
|
|
22
10
|
require 'polyamorous/tree_node'
|
@@ -24,7 +12,8 @@ if defined?(::ActiveRecord)
|
|
24
12
|
require 'polyamorous/swapping_reflection_class'
|
25
13
|
|
26
14
|
ar_version = ::ActiveRecord::VERSION::STRING[0,3]
|
27
|
-
ar_version = ::ActiveRecord::VERSION::STRING[0,5] if ar_version >=
|
15
|
+
ar_version = ::ActiveRecord::VERSION::STRING[0,5] if ar_version >= "5.2"
|
16
|
+
ar_version = "5.2.1" if ::ActiveRecord::VERSION::STRING >= "5.2.1"
|
28
17
|
|
29
18
|
%w(join_association join_dependency).each do |file|
|
30
19
|
require "polyamorous/activerecord_#{ar_version}_ruby_2/#{file}"
|
@@ -33,10 +22,4 @@ if defined?(::ActiveRecord)
|
|
33
22
|
Polyamorous::JoinDependency.send(:prepend, Polyamorous::JoinDependencyExtensions)
|
34
23
|
Polyamorous::JoinDependency.singleton_class.send(:prepend, Polyamorous::JoinDependencyExtensions::ClassMethods)
|
35
24
|
Polyamorous::JoinAssociation.send(:prepend, Polyamorous::JoinAssociationExtensions)
|
36
|
-
|
37
|
-
Polyamorous::JoinBase.class_eval do
|
38
|
-
if method_defined?(:active_record)
|
39
|
-
alias_method :base_klass, :active_record
|
40
|
-
end
|
41
|
-
end
|
42
25
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'ransack/context'
|
2
|
-
require 'ransack/adapters/active_record/compat'
|
3
2
|
require 'polyamorous'
|
4
3
|
|
5
4
|
module Ransack
|
@@ -7,11 +6,6 @@ module Ransack
|
|
7
6
|
module ActiveRecord
|
8
7
|
class Context < ::Ransack::Context
|
9
8
|
|
10
|
-
# Because the AR::Associations namespace is insane
|
11
|
-
if defined? ::ActiveRecord::Associations::JoinDependency
|
12
|
-
JoinDependency = ::ActiveRecord::Associations::JoinDependency
|
13
|
-
end
|
14
|
-
|
15
9
|
def initialize(object, options = {})
|
16
10
|
super
|
17
11
|
if ::ActiveRecord::VERSION::STRING < Constants::RAILS_5_2
|
@@ -37,9 +31,29 @@ module Ransack
|
|
37
31
|
def evaluate(search, opts = {})
|
38
32
|
viz = Visitor.new
|
39
33
|
relation = @object.where(viz.accept(search.base))
|
34
|
+
|
40
35
|
if search.sorts.any?
|
41
|
-
relation = relation.except(:order)
|
36
|
+
relation = relation.except(:order)
|
37
|
+
# Rather than applying all of the search's sorts in one fell swoop,
|
38
|
+
# as the original implementation does, we apply one at a time.
|
39
|
+
#
|
40
|
+
# If the sort (returned by the Visitor above) is a symbol, we know
|
41
|
+
# that it represents a scope on the model and we can apply that
|
42
|
+
# scope.
|
43
|
+
#
|
44
|
+
# Otherwise, we fall back to the applying the sort with the "order"
|
45
|
+
# method as the original implementation did. Actually the original
|
46
|
+
# implementation used "reorder," which was overkill since we already
|
47
|
+
# have a clean slate after "relation.except(:order)" above.
|
48
|
+
viz.accept(search.sorts).each do |scope_or_sort|
|
49
|
+
if scope_or_sort.is_a?(Symbol)
|
50
|
+
relation = relation.send(scope_or_sort)
|
51
|
+
else
|
52
|
+
relation = relation.order(scope_or_sort)
|
53
|
+
end
|
54
|
+
end
|
42
55
|
end
|
56
|
+
|
43
57
|
opts[:distinct] ? relation.distinct : relation
|
44
58
|
end
|
45
59
|
|
@@ -235,19 +249,19 @@ module Ransack
|
|
235
249
|
join_list = join_nodes + convert_join_strings_to_ast(relation.table, string_joins)
|
236
250
|
|
237
251
|
if ::ActiveRecord::VERSION::STRING < Constants::RAILS_5_2_0
|
238
|
-
join_dependency = JoinDependency.new(relation.klass, association_joins, join_list)
|
252
|
+
join_dependency = Polyamorous::JoinDependency.new(relation.klass, association_joins, join_list)
|
239
253
|
join_nodes.each do |join|
|
240
254
|
join_dependency.send(:alias_tracker).aliases[join.left.name.downcase] = 1
|
241
255
|
end
|
242
256
|
elsif ::ActiveRecord::VERSION::STRING == Constants::RAILS_5_2_0
|
243
257
|
alias_tracker = ::ActiveRecord::Associations::AliasTracker.create(self.klass.connection, relation.table.name, join_list)
|
244
|
-
join_dependency = JoinDependency.new(relation.klass, relation.table, association_joins, alias_tracker)
|
258
|
+
join_dependency = Polyamorous::JoinDependency.new(relation.klass, relation.table, association_joins, alias_tracker)
|
245
259
|
join_nodes.each do |join|
|
246
260
|
join_dependency.send(:alias_tracker).aliases[join.left.name.downcase] = 1
|
247
261
|
end
|
248
262
|
else
|
249
263
|
alias_tracker = ::ActiveRecord::Associations::AliasTracker.create(self.klass.connection, relation.table.name, join_list)
|
250
|
-
join_dependency = JoinDependency.new(relation.klass, relation.table, association_joins)
|
264
|
+
join_dependency = Polyamorous::JoinDependency.new(relation.klass, relation.table, association_joins)
|
251
265
|
join_dependency.instance_variable_set(:@alias_tracker, alias_tracker)
|
252
266
|
join_nodes.each do |join|
|
253
267
|
join_dependency.send(:alias_tracker).aliases[join.left.name.downcase] = 1
|
@@ -276,7 +290,7 @@ module Ransack
|
|
276
290
|
|
277
291
|
def build_association(name, parent = @base, klass = nil)
|
278
292
|
if ::ActiveRecord::VERSION::STRING < Constants::RAILS_5_2_0
|
279
|
-
jd = JoinDependency.new(
|
293
|
+
jd = Polyamorous::JoinDependency.new(
|
280
294
|
parent.base_klass,
|
281
295
|
Polyamorous::Join.new(name, @join_type, klass),
|
282
296
|
[]
|
@@ -284,7 +298,7 @@ module Ransack
|
|
284
298
|
found_association = jd.join_root.children.last
|
285
299
|
elsif ::ActiveRecord::VERSION::STRING == Constants::RAILS_5_2_0
|
286
300
|
alias_tracker = ::ActiveRecord::Associations::AliasTracker.create(self.klass.connection, parent.table.name, [])
|
287
|
-
jd = JoinDependency.new(
|
301
|
+
jd = Polyamorous::JoinDependency.new(
|
288
302
|
parent.base_klass,
|
289
303
|
parent.base_klass.arel_table,
|
290
304
|
Polyamorous::Join.new(name, @join_type, klass),
|
@@ -292,7 +306,7 @@ module Ransack
|
|
292
306
|
)
|
293
307
|
found_association = jd.instance_variable_get(:@join_root).children.last
|
294
308
|
else
|
295
|
-
jd = JoinDependency.new(
|
309
|
+
jd = Polyamorous::JoinDependency.new(
|
296
310
|
parent.base_klass,
|
297
311
|
parent.base_klass.arel_table,
|
298
312
|
Polyamorous::Join.new(name, @join_type, klass),
|
@@ -21,11 +21,15 @@ module Ransack
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def visit_Ransack_Nodes_Sort(object)
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
if object.valid?
|
25
|
+
if object.attr.is_a?(Arel::Attributes::Attribute)
|
26
|
+
object.attr.send(object.dir)
|
27
|
+
else
|
28
|
+
ordered(object)
|
29
|
+
end
|
27
30
|
else
|
28
|
-
|
31
|
+
scope_name = :"sort_by_#{object.name}_#{object.dir}"
|
32
|
+
scope_name if object.context.object.respond_to?(scope_name)
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
ar:
|
2
|
+
ransack:
|
3
|
+
search: "بحث"
|
4
|
+
predicate: "فاعل"
|
5
|
+
and: "و"
|
6
|
+
or: "أو"
|
7
|
+
any: "أيُّ"
|
8
|
+
all: "كل"
|
9
|
+
combinator: "دالة توافقية"
|
10
|
+
attribute: "خاصية"
|
11
|
+
value: "قيمة"
|
12
|
+
condition: "شرط"
|
13
|
+
sort: "ترتيب"
|
14
|
+
asc: "تصاعدي"
|
15
|
+
desc: "تنازلي"
|
16
|
+
predicates:
|
17
|
+
eq: "معادل"
|
18
|
+
eq_any: "معادل على اﻷقل لواحد"
|
19
|
+
eq_all: "معادل للجميع"
|
20
|
+
not_eq: "ليس معادلا لـ"
|
21
|
+
not_eq_any: "ليس معادلا على اﻷقل لواحد"
|
22
|
+
not_eq_all: "ليس معادلا للجميع"
|
23
|
+
matches: "موائم"
|
24
|
+
matches_any: "موائم لواحد على اﻷقل"
|
25
|
+
matches_all: "موائم للجميع"
|
26
|
+
does_not_match: "لا يتواءم"
|
27
|
+
does_not_match_any: "لا يتواءم مع واحد على اﻷقل"
|
28
|
+
does_not_match_all: "لا يتواءم مع الجميع"
|
29
|
+
lt: "أصغر من"
|
30
|
+
lt_any: "أصغر لواحد على اﻷقل"
|
31
|
+
lt_all: "أصغر من الجميع"
|
32
|
+
lteq: "أصغر أو مساو لـ"
|
33
|
+
lteq_any: "أصغر أو مساو لواحد على اﻷقل"
|
34
|
+
lteq_all: "أصغر أو مساو للجميع"
|
35
|
+
gt: "أكبر من"
|
36
|
+
gt_any: "أكبر من واحد على اﻷقل"
|
37
|
+
gt_all: "أكبر من الجميع"
|
38
|
+
gteq: "أكبر أو مساو لـ"
|
39
|
+
gteq_any: "أكبر أو مساو لواحد على اﻷقل"
|
40
|
+
gteq_all: "أكبر أو مساو للجميع"
|
41
|
+
in: "متضمن لـ"
|
42
|
+
in_any: "متضمن لواحد على اﻷقل"
|
43
|
+
in_all: "متضمن للجميع"
|
44
|
+
not_in: "غير متضمن"
|
45
|
+
not_in_any: "غير متضمن لواحد على اﻷقل"
|
46
|
+
not_in_all: "غير متضمن للجميع"
|
47
|
+
cont: "محتو"
|
48
|
+
cont_any: "محتو لواحد على اﻷقل"
|
49
|
+
cont_all: "محتو لجميع"
|
50
|
+
not_cont: "غير محتو"
|
51
|
+
not_cont_any: "غير محتو لواحد على اﻷقل"
|
52
|
+
not_cont_all: "غير محتو للجميع"
|
53
|
+
start: "يبدأ بـ"
|
54
|
+
start_any: "يبدأ بواحد على اﻷقل"
|
55
|
+
start_all: "يبدأ بالجميع"
|
56
|
+
not_start: "لا يبدأ بـ"
|
57
|
+
not_start_any: "لا يبدأ بواحد على اﻷقل"
|
58
|
+
not_start_all: "لا يبدأ بالجميع"
|
59
|
+
end: "ينتهي بـ"
|
60
|
+
end_any: "ينتهي بواحد على اﻷقل"
|
61
|
+
end_all: "ينتهي بالجميع"
|
62
|
+
not_end: "لا ينتهي بـ"
|
63
|
+
not_end_any: "لا ينتهي بواحد على اﻷقل"
|
64
|
+
not_end_all: "لا ينتهي بالجميع"
|
65
|
+
'true': "صحيح"
|
66
|
+
'false': "خطأ"
|
67
|
+
present: "مستقبل"
|
68
|
+
blank: "فراغ"
|
69
|
+
'null': "عدم"
|
70
|
+
not_null: "غير مساو لقيمة عدم"
|
@@ -0,0 +1,70 @@
|
|
1
|
+
bg:
|
2
|
+
ransack:
|
3
|
+
search: "търсене"
|
4
|
+
predicate: "предикат"
|
5
|
+
and: "и"
|
6
|
+
or: "или"
|
7
|
+
any: "всякакво"
|
8
|
+
all: "всички"
|
9
|
+
combinator: "комбинатор"
|
10
|
+
attribute: "атрибут"
|
11
|
+
value: "стойност"
|
12
|
+
condition: "условие"
|
13
|
+
sort: "сортиране"
|
14
|
+
asc: "възходящ"
|
15
|
+
desc: "низходящ"
|
16
|
+
predicates:
|
17
|
+
eq: "се равнява на"
|
18
|
+
eq_any: "се равнява на всяко"
|
19
|
+
eq_all: "се равнява на всички"
|
20
|
+
not_eq: "не е равно на"
|
21
|
+
not_eq_any: "не е равно на никое от"
|
22
|
+
not_eq_all: "не е равно на всички"
|
23
|
+
matches: "съвпада"
|
24
|
+
matches_any: "съвпада с някое"
|
25
|
+
matches_all: "съвпада с всички"
|
26
|
+
does_not_match: "не съвпада"
|
27
|
+
does_not_match_any: "не съвпада с никое"
|
28
|
+
does_not_match_all: "не съвпада с всички"
|
29
|
+
lt: "по-малко от"
|
30
|
+
lt_any: "по-малко от някое"
|
31
|
+
lt_all: "по-малко от всички"
|
32
|
+
lteq: "по-малко или равно на"
|
33
|
+
lteq_any: "по-малко или равно на някое"
|
34
|
+
lteq_all: "по-малко или равно на всички"
|
35
|
+
gt: "по-голямо от"
|
36
|
+
gt_any: "по-голямо от всякое"
|
37
|
+
gt_all: "по-голямо от всички"
|
38
|
+
gteq: "по-голямо или равно на"
|
39
|
+
gteq_any: "по-голямо или равно на всякое"
|
40
|
+
gteq_all: "по-голямо или равно на всички"
|
41
|
+
in: "в"
|
42
|
+
in_any: "във всякое"
|
43
|
+
in_all: "във всички"
|
44
|
+
not_in: "не в"
|
45
|
+
not_in_any: "не в никое"
|
46
|
+
not_in_all: "не във всички"
|
47
|
+
cont: "съдържа"
|
48
|
+
cont_any: "съдържа всякое"
|
49
|
+
cont_all: "съдържа всички"
|
50
|
+
not_cont: "не съдържа"
|
51
|
+
not_cont_any: "не съдържа никое"
|
52
|
+
not_cont_all: "не съдържа всички"
|
53
|
+
start: "започва с"
|
54
|
+
start_any: "започва с всякое"
|
55
|
+
start_all: "започва с всички"
|
56
|
+
not_start: "не започва с"
|
57
|
+
not_start_any: "не започва с никое"
|
58
|
+
not_start_all: "не започва с всички"
|
59
|
+
end: "завършва с"
|
60
|
+
end_any: "завършва с всякое"
|
61
|
+
end_all: "завършва с всички"
|
62
|
+
not_end: "не завършва с"
|
63
|
+
not_end_any: "не завършва с никое"
|
64
|
+
not_end_all: "не завършва с всички"
|
65
|
+
'true': "истина"
|
66
|
+
'false': "неистина"
|
67
|
+
present: "присъства"
|
68
|
+
blank: "е празно"
|
69
|
+
'null': "е нула"
|
70
|
+
not_null: "не е нула"
|