hobo 1.3.0.pre22 → 1.3.0.pre23
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/doctests/hobo/scopes.rdoctest +4 -8
- data/lib/hobo/controller.rb +8 -11
- data/lib/hobo/engine.rb +4 -4
- data/lib/hobo/extensions/active_record/{association_collection.rb → associations/collection.rb} +0 -0
- data/lib/hobo/extensions/active_record/{association_proxy.rb → associations/proxy.rb} +6 -7
- data/lib/hobo/extensions/active_record/associations/reflection.rb +23 -0
- data/lib/hobo/extensions/active_record/associations/scope.rb +35 -0
- data/lib/hobo/extensions/array.rb +12 -0
- data/lib/hobo/model.rb +1 -1
- data/lib/hobo/model/lifecycles/lifecycle.rb +1 -1
- data/lib/hobo/model/scopes/automatic_scopes.rb +79 -89
- data/lib/hobo/rapid/generators/rapid/cards.dryml.erb +1 -1
- data/lib/hobo/rapid/generators/rapid/pages.dryml.erb +6 -6
- metadata +17 -17
- data/lib/hobo/extensions/active_record/association_reflection.rb +0 -19
- data/lib/hobo/extensions/active_record/scopes.rb +0 -31
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.0.
|
1
|
+
1.3.0.pre23
|
@@ -285,18 +285,14 @@ Gives the N most recent items:
|
|
285
285
|
|
286
286
|
## include
|
287
287
|
|
288
|
-
DEPRECATED: Automatic scope :include has been deprecated: use :
|
288
|
+
DEPRECATED: Automatic scope :include has been deprecated: use :includes instead.
|
289
289
|
|
290
|
-
##
|
290
|
+
## includes
|
291
291
|
|
292
|
-
|
293
|
-
the `:include` option to the `find` method.
|
294
|
-
|
295
|
-
>> Person.search("B", :name).including(:friends).*.name # test LH#839
|
292
|
+
>> Person.search("B", :name).includes(:friends).*.name # test LH#839
|
296
293
|
=> ["Bryan", "Bethany"]
|
297
|
-
.hidden
|
298
294
|
|
299
|
-
>> Person.
|
295
|
+
>> Person.includes(:friends).*.name
|
300
296
|
=> ["Bryan", "Bethany"]
|
301
297
|
|
302
298
|
## search
|
data/lib/hobo/controller.rb
CHANGED
@@ -58,10 +58,9 @@ module Hobo
|
|
58
58
|
|
59
59
|
def hobo_ajax_response(*args)
|
60
60
|
results = args.extract_options!
|
61
|
-
page_path = params[:page_path]
|
62
61
|
r = params[:render]
|
63
62
|
if r
|
64
|
-
ajax_update_response(
|
63
|
+
ajax_update_response(r.values, results)
|
65
64
|
true
|
66
65
|
else
|
67
66
|
false
|
@@ -69,15 +68,13 @@ module Hobo
|
|
69
68
|
end
|
70
69
|
|
71
70
|
|
72
|
-
def ajax_update_response(
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
renderer = Dryml.page_renderer(view_context, identifier, [], controller)
|
80
|
-
end
|
71
|
+
def ajax_update_response(render_specs, results={})
|
72
|
+
controller, action = controller_action_from_page_path
|
73
|
+
identifier = view_context.view_paths.find( action,
|
74
|
+
controller,
|
75
|
+
false,
|
76
|
+
view_context.lookup_context.instance_variable_get('@details')).identifier
|
77
|
+
renderer = Dryml.page_renderer(view_context, identifier, [], controller)
|
81
78
|
|
82
79
|
render :update do |page|
|
83
80
|
page << "var _update = typeof Hobo == 'undefined' ? Element.update : Hobo.updateElement;"
|
data/lib/hobo/engine.rb
CHANGED
@@ -23,12 +23,12 @@ module Hobo
|
|
23
23
|
end
|
24
24
|
|
25
25
|
ActiveSupport.on_load(:active_record) do
|
26
|
-
require 'hobo/extensions/active_record/
|
27
|
-
require 'hobo/extensions/active_record/
|
28
|
-
require 'hobo/extensions/active_record/
|
26
|
+
require 'hobo/extensions/active_record/associations/collection'
|
27
|
+
require 'hobo/extensions/active_record/associations/proxy'
|
28
|
+
require 'hobo/extensions/active_record/associations/reflection'
|
29
29
|
require 'hobo/extensions/active_record/hobo_methods'
|
30
30
|
require 'hobo/extensions/active_record/permissions'
|
31
|
-
require 'hobo/extensions/active_record/
|
31
|
+
require 'hobo/extensions/active_record/associations/scope'
|
32
32
|
require 'hobo/extensions/active_record/relation_with_origin'
|
33
33
|
require 'hobo/extensions/active_model/name'
|
34
34
|
require 'hobo/extensions/active_model/translation'
|
data/lib/hobo/extensions/active_record/{association_collection.rb → associations/collection.rb}
RENAMED
File without changes
|
@@ -2,17 +2,16 @@ module ActiveRecord
|
|
2
2
|
module Associations
|
3
3
|
class AssociationProxy #:nodoc:
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
def origin
|
6
|
+
proxy_owner
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
def origin_attribute
|
10
|
+
proxy_reflection.name
|
11
|
+
end
|
12
12
|
|
13
13
|
private
|
14
14
|
|
15
|
-
|
16
15
|
def raise_on_type_mismatch(record)
|
17
16
|
# Don't complain if the interface type of a polymorphic association doesn't exist
|
18
17
|
klass = @reflection.klass rescue nil
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Reflection
|
3
|
+
class AssociationReflection
|
4
|
+
|
5
|
+
alias_method :association_name, :name
|
6
|
+
|
7
|
+
def klass_with_create_polymorphic_class
|
8
|
+
if options[:polymorphic]
|
9
|
+
begin
|
10
|
+
klass_without_create_polymorphic_class
|
11
|
+
rescue NameError => e
|
12
|
+
Object.class_eval "class #{e.missing_name} < ActiveRecord::Base; set_table_name '#{active_record.name.tableize}'; end"
|
13
|
+
e.missing_name.constantize
|
14
|
+
end
|
15
|
+
else
|
16
|
+
klass_without_create_polymorphic_class
|
17
|
+
end
|
18
|
+
end
|
19
|
+
alias_method_chain :klass, :create_polymorphic_class
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Add support for :scope => :my_scope to associations
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Associations
|
5
|
+
module ThroughAssociationScope
|
6
|
+
|
7
|
+
def construct_scope_with_scope
|
8
|
+
s = construct_scope_without_scope
|
9
|
+
s[:find][:scope] = @reflection.options[:scope]
|
10
|
+
s
|
11
|
+
end
|
12
|
+
alias_method_chain :construct_scope, :scope
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module SpawnMethods
|
18
|
+
|
19
|
+
def apply_finder_options_with_scope(options)
|
20
|
+
scopes = []
|
21
|
+
Array.wrap(options.delete(:scope)).each do |s|
|
22
|
+
if s.is_a?(Hash)
|
23
|
+
s.each_pair{|k,v| scopes << [k,v] }
|
24
|
+
else
|
25
|
+
scopes << [s]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
relation = apply_finder_options_without_scope(options)
|
29
|
+
return relation if scopes.empty?
|
30
|
+
scopes.inject(relation) {|r, s| r.send *s }
|
31
|
+
end
|
32
|
+
alias_method_chain :apply_finder_options, :scope
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
# Add support for type metadata to arrays
|
2
|
+
|
3
|
+
require 'will_paginate/array'
|
4
|
+
|
2
5
|
class Array
|
3
6
|
|
4
7
|
attr_accessor :member_class, :origin, :origin_attribute
|
@@ -12,4 +15,13 @@ class Array
|
|
12
15
|
origin and origin_id = origin.try.typed_id and "#{origin_id}:#{origin_attribute}"
|
13
16
|
end
|
14
17
|
|
18
|
+
def paginate_with_hobo_metadata(*args, &block)
|
19
|
+
collection = paginate_without_hobo_metadata(*args, &block)
|
20
|
+
collection.member_class = member_class
|
21
|
+
collection.origin = try.proxy_owner
|
22
|
+
collection.origin_attribute = try.proxy_reflection._?.name
|
23
|
+
collection
|
24
|
+
end
|
25
|
+
alias_method_chain :paginate, :hobo_metadata
|
26
|
+
|
15
27
|
end
|
data/lib/hobo/model.rb
CHANGED
@@ -61,7 +61,7 @@ module Hobo
|
|
61
61
|
WillPaginate::Finders::Base.class_eval do
|
62
62
|
def paginate_with_hobo_metadata(*args, &block)
|
63
63
|
collection = paginate_without_hobo_metadata(*args, &block)
|
64
|
-
collection.member_class = self
|
64
|
+
collection.member_class = self.is_a?(ActiveRecord::Relation) ? member_class : self
|
65
65
|
collection.origin = try.proxy_owner
|
66
66
|
collection.origin_attribute = try.proxy_reflection._?.name
|
67
67
|
collection
|
@@ -31,11 +31,11 @@ module Hobo
|
|
31
31
|
def create_scope(check_only=false)
|
32
32
|
matched_scope = true
|
33
33
|
|
34
|
-
|
34
|
+
case
|
35
35
|
# --- Association Queries --- #
|
36
36
|
|
37
37
|
# with_players(player1, player2)
|
38
|
-
|
38
|
+
when name =~ /^with_(.*)/ && (refl = reflection($1))
|
39
39
|
return true if check_only
|
40
40
|
|
41
41
|
def_scope do |*records|
|
@@ -49,7 +49,7 @@ module Hobo
|
|
49
49
|
end
|
50
50
|
|
51
51
|
# with_player(a_player)
|
52
|
-
|
52
|
+
when name =~ /^with_(.*)/ && (refl = reflection($1.pluralize))
|
53
53
|
return true if check_only
|
54
54
|
|
55
55
|
exists_sql = exists_sql_condition(refl)
|
@@ -59,7 +59,7 @@ module Hobo
|
|
59
59
|
end
|
60
60
|
|
61
61
|
# any_of_players(player1, player2)
|
62
|
-
|
62
|
+
when name =~ /^any_of_(.*)/ && (refl = reflection($1))
|
63
63
|
return true if check_only
|
64
64
|
|
65
65
|
def_scope do |*records|
|
@@ -73,7 +73,7 @@ module Hobo
|
|
73
73
|
end
|
74
74
|
|
75
75
|
# without_players(player1, player2)
|
76
|
-
|
76
|
+
when name =~ /^without_(.*)/ && (refl = reflection($1))
|
77
77
|
return true if check_only
|
78
78
|
|
79
79
|
def_scope do |*records|
|
@@ -87,7 +87,7 @@ module Hobo
|
|
87
87
|
end
|
88
88
|
|
89
89
|
# without_player(a_player)
|
90
|
-
|
90
|
+
when name =~ /^without_(.*)/ && (refl = reflection($1.pluralize))
|
91
91
|
return true if check_only
|
92
92
|
|
93
93
|
exists_sql = exists_sql_condition(refl)
|
@@ -97,7 +97,7 @@ module Hobo
|
|
97
97
|
end
|
98
98
|
|
99
99
|
# team_is(a_team)
|
100
|
-
|
100
|
+
when name =~ /^(.*)_is$/ && (refl = reflection($1)) && refl.macro.in?([:has_one, :belongs_to])
|
101
101
|
return true if check_only
|
102
102
|
|
103
103
|
if refl.options[:polymorphic]
|
@@ -113,7 +113,7 @@ module Hobo
|
|
113
113
|
end
|
114
114
|
|
115
115
|
# team_is_not(a_team)
|
116
|
-
|
116
|
+
when name =~ /^(.*)_is_not$/ && (refl = reflection($1)) && refl.macro.in?([:has_one, :belongs_to])
|
117
117
|
return true if check_only
|
118
118
|
|
119
119
|
if refl.options[:polymorphic]
|
@@ -132,7 +132,7 @@ module Hobo
|
|
132
132
|
# --- Column Queries --- #
|
133
133
|
|
134
134
|
# name_is(str)
|
135
|
-
|
135
|
+
when name =~ /^(.*)_is$/ && (col = column($1))
|
136
136
|
return true if check_only
|
137
137
|
|
138
138
|
def_scope do |str|
|
@@ -140,7 +140,7 @@ module Hobo
|
|
140
140
|
end
|
141
141
|
|
142
142
|
# name_is_not(str)
|
143
|
-
|
143
|
+
when name =~ /^(.*)_is_not$/ && (col = column($1))
|
144
144
|
return true if check_only
|
145
145
|
|
146
146
|
def_scope do |str|
|
@@ -148,7 +148,7 @@ module Hobo
|
|
148
148
|
end
|
149
149
|
|
150
150
|
# name_contains(str)
|
151
|
-
|
151
|
+
when name =~ /^(.*)_contains$/ && (col = column($1))
|
152
152
|
return true if check_only
|
153
153
|
|
154
154
|
def_scope do |str|
|
@@ -156,7 +156,7 @@ module Hobo
|
|
156
156
|
end
|
157
157
|
|
158
158
|
# name_does_not_contain
|
159
|
-
|
159
|
+
when name =~ /^(.*)_does_not_contain$/ && (col = column($1))
|
160
160
|
return true if check_only
|
161
161
|
|
162
162
|
def_scope do |str|
|
@@ -164,7 +164,7 @@ module Hobo
|
|
164
164
|
end
|
165
165
|
|
166
166
|
# name_starts(str)
|
167
|
-
|
167
|
+
when name =~ /^(.*)_starts$/ && (col = column($1))
|
168
168
|
return true if check_only
|
169
169
|
|
170
170
|
def_scope do |str|
|
@@ -172,7 +172,7 @@ module Hobo
|
|
172
172
|
end
|
173
173
|
|
174
174
|
# name_does_not_start
|
175
|
-
|
175
|
+
when name =~ /^(.*)_does_not_start$/ && (col = column($1))
|
176
176
|
return true if check_only
|
177
177
|
|
178
178
|
def_scope do |str|
|
@@ -180,7 +180,7 @@ module Hobo
|
|
180
180
|
end
|
181
181
|
|
182
182
|
# name_ends(str)
|
183
|
-
|
183
|
+
when name =~ /^(.*)_ends$/ && (col = column($1))
|
184
184
|
return true if check_only
|
185
185
|
|
186
186
|
def_scope do |str|
|
@@ -188,7 +188,7 @@ module Hobo
|
|
188
188
|
end
|
189
189
|
|
190
190
|
# name_does_not_end(str)
|
191
|
-
|
191
|
+
when name =~ /^(.*)_does_not_end$/ && (col = column($1))
|
192
192
|
return true if check_only
|
193
193
|
|
194
194
|
def_scope do |str|
|
@@ -196,7 +196,7 @@ module Hobo
|
|
196
196
|
end
|
197
197
|
|
198
198
|
# published (a boolean column)
|
199
|
-
|
199
|
+
when (col = column(name)) && (col.type == :boolean)
|
200
200
|
return true if check_only
|
201
201
|
|
202
202
|
def_scope do
|
@@ -204,7 +204,7 @@ module Hobo
|
|
204
204
|
end
|
205
205
|
|
206
206
|
# not_published
|
207
|
-
|
207
|
+
when name =~ /^not_(.*)$/ && (col = column($1)) && (col.type == :boolean)
|
208
208
|
return true if check_only
|
209
209
|
|
210
210
|
def_scope do
|
@@ -212,7 +212,7 @@ module Hobo
|
|
212
212
|
end
|
213
213
|
|
214
214
|
# published_before(time)
|
215
|
-
|
215
|
+
when name =~ /^(.*)_before$/ && (col = column("#{$1}_at") || column("#{$1}_date") || column("#{$1}_on")) && col.type.in?([:date, :datetime, :time, :timestamp])
|
216
216
|
return true if check_only
|
217
217
|
|
218
218
|
def_scope do |time|
|
@@ -220,7 +220,7 @@ module Hobo
|
|
220
220
|
end
|
221
221
|
|
222
222
|
# published_after(time)
|
223
|
-
|
223
|
+
when name =~ /^(.*)_after$/ && (col = column("#{$1}_at") || column("#{$1}_date") || column("#{$1}_on")) && col.type.in?([:date, :datetime, :time, :timestamp])
|
224
224
|
return true if check_only
|
225
225
|
|
226
226
|
def_scope do |time|
|
@@ -228,7 +228,7 @@ module Hobo
|
|
228
228
|
end
|
229
229
|
|
230
230
|
# published_between(time1, time2)
|
231
|
-
|
231
|
+
when name =~ /^(.*)_between$/ && (col = column("#{$1}_at") || column("#{$1}_date") || column("#{$1}_on")) && col.type.in?([:date, :datetime, :time, :timestamp])
|
232
232
|
return true if check_only
|
233
233
|
|
234
234
|
def_scope do |time1, time2|
|
@@ -236,12 +236,12 @@ module Hobo
|
|
236
236
|
end
|
237
237
|
|
238
238
|
# active (a lifecycle state)
|
239
|
-
|
239
|
+
when @klass.has_lifecycle? && name.to_sym.in?(@klass::Lifecycle.state_names)
|
240
240
|
return true if check_only
|
241
241
|
|
242
242
|
if @klass::Lifecycle.state_names.length == 1
|
243
243
|
# nothing to check for - create a dummy scope
|
244
|
-
def_scope { @klass.
|
244
|
+
def_scope { @klass.scoped }
|
245
245
|
true
|
246
246
|
else
|
247
247
|
def_scope do
|
@@ -250,104 +250,94 @@ module Hobo
|
|
250
250
|
end
|
251
251
|
|
252
252
|
# self is / is not
|
253
|
-
|
253
|
+
when name == "is"
|
254
254
|
return true if check_only
|
255
255
|
|
256
256
|
def_scope do |record|
|
257
257
|
@klass.where "#{@klass.table_name}.#{@klass.primary_key} = ?", record
|
258
258
|
end
|
259
259
|
|
260
|
-
|
260
|
+
when name == "is_not"
|
261
261
|
return true if check_only
|
262
262
|
|
263
263
|
def_scope do |record|
|
264
264
|
@klass.where "#{@klass.table_name}.#{@klass.primary_key} <> ?", record
|
265
265
|
end
|
266
266
|
|
267
|
-
else
|
268
|
-
|
269
|
-
case name
|
270
267
|
|
271
|
-
|
272
|
-
|
268
|
+
when name == "by_most_recent"
|
269
|
+
return true if check_only
|
273
270
|
|
274
|
-
|
275
|
-
|
276
|
-
|
271
|
+
def_scope do
|
272
|
+
@klass.order "#{@klass.table_name}.created_at DESC"
|
273
|
+
end
|
277
274
|
|
278
|
-
|
279
|
-
|
275
|
+
when name == "recent"
|
276
|
+
return true if check_only
|
280
277
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
end
|
286
|
-
else
|
287
|
-
def_scope do |*args|
|
288
|
-
count = args.first || 6
|
289
|
-
limit(count)
|
290
|
-
end
|
278
|
+
if "created_at".in?(@klass.columns.*.name)
|
279
|
+
def_scope do |*args|
|
280
|
+
count = args.first || 6
|
281
|
+
@klass.order("#{@klass.table_name}.created_at DESC").limit(count)
|
291
282
|
end
|
292
|
-
|
293
|
-
when "order_by"
|
294
|
-
return true if check_only
|
295
|
-
|
296
|
-
klass = @klass
|
283
|
+
else
|
297
284
|
def_scope do |*args|
|
298
|
-
|
299
|
-
|
300
|
-
if type.nil? #a virtual attribute from an SQL alias, e.g., 'total' from 'COUNT(*) AS total'
|
301
|
-
colspec = "#{field}" # don't prepend the table name
|
302
|
-
elsif type.respond_to?(:name_attribute) && (name = type.name_attribute)
|
303
|
-
include = field
|
304
|
-
colspec = "#{type.table_name}.#{name}"
|
305
|
-
else
|
306
|
-
colspec = "#{klass.table_name}.#{field}"
|
307
|
-
end
|
308
|
-
@klass.includes(include).order("#{colspec} #{asc._?.upcase}")
|
285
|
+
count = args.first || 6
|
286
|
+
limit(count)
|
309
287
|
end
|
288
|
+
end
|
310
289
|
|
290
|
+
when name == "order_by"
|
291
|
+
# DEPRECATED: use :order instead.
|
292
|
+
Rails.logger.warn "Automatic scope :order_by has been deprecated: use :order instead."
|
293
|
+
return true if check_only
|
311
294
|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
295
|
+
klass = @klass
|
296
|
+
def_scope do |*args|
|
297
|
+
field, asc = args
|
298
|
+
type = klass.attr_type(field)
|
299
|
+
if type.nil? #a virtual attribute from an SQL alias, e.g., 'total' from 'COUNT(*) AS total'
|
300
|
+
colspec = "#{field}" # don't prepend the table name
|
301
|
+
elsif type.respond_to?(:name_attribute) && (name = type.name_attribute)
|
302
|
+
include = field
|
303
|
+
colspec = "#{type.table_name}.#{name}"
|
304
|
+
else
|
305
|
+
colspec = "#{klass.table_name}.#{field}"
|
320
306
|
end
|
307
|
+
@klass.includes(include).order("#{colspec} #{asc._?.upcase}")
|
308
|
+
end
|
321
309
|
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
end
|
310
|
+
when name == "include"
|
311
|
+
# DEPRECATED: it clashes with Module.include when called on an ActiveRecord::Relation
|
312
|
+
# after a scope chain, if you didn't call it on the class itself first
|
313
|
+
Rails.logger.warn "Automatic scope :include has been deprecated: use :includes instead."
|
314
|
+
return true if check_only
|
328
315
|
|
329
|
-
|
330
|
-
|
316
|
+
def_scope do |inclusions|
|
317
|
+
@klass.includes(inclusions)
|
318
|
+
end
|
331
319
|
|
332
|
-
|
333
|
-
|
320
|
+
when name == "search"
|
321
|
+
return true if check_only
|
334
322
|
|
335
|
-
|
336
|
-
|
337
|
-
word_queries = words.map do |word|
|
338
|
-
field_query = '(' + fields.map { |field| "(#{@klass.table_name}.#{field} #{match_keyword} ?)" }.join(" OR ") + ')'
|
339
|
-
args += ["%#{word}%"] * fields.length
|
340
|
-
field_query
|
341
|
-
end
|
323
|
+
def_scope do |query, *fields|
|
324
|
+
match_keyword = ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" ? "ILIKE" : "LIKE"
|
342
325
|
|
343
|
-
|
326
|
+
words = query.split
|
327
|
+
args = []
|
328
|
+
word_queries = words.map do |word|
|
329
|
+
field_query = '(' + fields.map { |field| "(#{@klass.table_name}.#{field} #{match_keyword} ?)" }.join(" OR ") + ')'
|
330
|
+
args += ["%#{word}%"] * fields.length
|
331
|
+
field_query
|
344
332
|
end
|
345
333
|
|
346
|
-
|
347
|
-
matched_scope = false
|
334
|
+
@klass.where *([word_queries.join(" AND ")] + args)
|
348
335
|
end
|
349
336
|
|
337
|
+
else
|
338
|
+
matched_scope = false
|
350
339
|
end
|
340
|
+
|
351
341
|
matched_scope
|
352
342
|
end
|
353
343
|
|
@@ -53,7 +53,7 @@ model_key = model.to_s.underscore
|
|
53
53
|
<view:<%= creator_attribute %> param="creator"/>
|
54
54
|
<% end -%>
|
55
55
|
<% if primary_collection -%>
|
56
|
-
<ht key="<%= primary_collection.to_s.underscore %>.collection.count" count="&this.<%= primary_collection %>.size">
|
56
|
+
<ht key="<%= model.reflect_on_association(primary_collection).klass.to_s.underscore %>.collection.count" count="&this.<%= primary_collection %>.size">
|
57
57
|
<count:<%= primary_collection%> param/>
|
58
58
|
</ht>
|
59
59
|
<% end -%>
|
@@ -177,7 +177,7 @@ end
|
|
177
177
|
<% if collection -%>
|
178
178
|
<section param="collection-section">
|
179
179
|
<h3 param="collection-heading">
|
180
|
-
<ht key="<%=
|
180
|
+
<ht key="<%= collection_class.to_s.underscore %>.collection.heading" count="&this.<%= collection.to_s %>.count" >
|
181
181
|
<human-collection-name collection="<%= collection %>" your/>
|
182
182
|
</ht>
|
183
183
|
</h3>
|
@@ -190,21 +190,21 @@ end
|
|
190
190
|
<% if add_link -%>
|
191
191
|
|
192
192
|
<a:<%= collection %> action="new" if="&can_create?(@<%= model.name.underscore %>.<%= collection %>)" param="new-link">
|
193
|
-
<ht key="<%=
|
194
|
-
New <%=
|
193
|
+
<ht key="<%= collection_class.to_s.underscore %>.actions.new" count="1">
|
194
|
+
New <%= collection_class.to_s.titleize %>
|
195
195
|
</ht>
|
196
196
|
</a:<%= collection %>>
|
197
197
|
<% elsif add_form -%>
|
198
198
|
|
199
199
|
<section param="add-to-collection" if="&can_create?(@<%= model.name.underscore %>.<%= collection %>)">
|
200
200
|
<h3 param="add-form-heading">
|
201
|
-
<ht key="<%=
|
202
|
-
Add <%= a_or_an
|
201
|
+
<ht key="<%= collection_class.to_s.underscore %>.collection.add_form_heading" count="1">
|
202
|
+
Add <%= a_or_an collection_class.to_s.titleize %>
|
203
203
|
</ht>
|
204
204
|
</h3>
|
205
205
|
<form with="&@<%= collection_class.name.underscore %> || new_for_current_user(@<%= model.name.underscore %>.<%= collection %>)" owner="<%= owner %>" without-cancel param>
|
206
206
|
<field-list: skip="<%= owner %>"/>
|
207
|
-
<submit: label="#{ht '<%= sq_escape
|
207
|
+
<submit: label="#{ht '<%= sq_escape collection_class.to_s.underscore %>.actions.add', :default=>['Add'] }"/>
|
208
208
|
</form>
|
209
209
|
</section>
|
210
210
|
<% end -%>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hobo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: -
|
4
|
+
hash: -1637108443
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 3
|
9
9
|
- 0
|
10
|
-
-
|
11
|
-
version: 1.3.0.
|
10
|
+
- pre23
|
11
|
+
version: 1.3.0.pre23
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Tom Locke
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-11-
|
19
|
+
date: 2010-11-28 00:00:00 -04:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -59,13 +59,13 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
hash: -
|
62
|
+
hash: -1637108443
|
63
63
|
segments:
|
64
64
|
- 1
|
65
65
|
- 3
|
66
66
|
- 0
|
67
|
-
-
|
68
|
-
version: 1.3.0.
|
67
|
+
- pre23
|
68
|
+
version: 1.3.0.pre23
|
69
69
|
type: :runtime
|
70
70
|
version_requirements: *id003
|
71
71
|
- !ruby/object:Gem::Dependency
|
@@ -76,13 +76,13 @@ dependencies:
|
|
76
76
|
requirements:
|
77
77
|
- - "="
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
hash: -
|
79
|
+
hash: -1637108443
|
80
80
|
segments:
|
81
81
|
- 1
|
82
82
|
- 3
|
83
83
|
- 0
|
84
|
-
-
|
85
|
-
version: 1.3.0.
|
84
|
+
- pre23
|
85
|
+
version: 1.3.0.pre23
|
86
86
|
type: :runtime
|
87
87
|
version_requirements: *id004
|
88
88
|
- !ruby/object:Gem::Dependency
|
@@ -93,13 +93,13 @@ dependencies:
|
|
93
93
|
requirements:
|
94
94
|
- - "="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
hash: -
|
96
|
+
hash: -1637108443
|
97
97
|
segments:
|
98
98
|
- 1
|
99
99
|
- 3
|
100
100
|
- 0
|
101
|
-
-
|
102
|
-
version: 1.3.0.
|
101
|
+
- pre23
|
102
|
+
version: 1.3.0.pre23
|
103
103
|
type: :runtime
|
104
104
|
version_requirements: *id005
|
105
105
|
- !ruby/object:Gem::Dependency
|
@@ -266,13 +266,13 @@ files:
|
|
266
266
|
- lib/hobo/extensions/action_view/translation_helper.rb
|
267
267
|
- lib/hobo/extensions/active_model/name.rb
|
268
268
|
- lib/hobo/extensions/active_model/translation.rb
|
269
|
-
- lib/hobo/extensions/active_record/
|
270
|
-
- lib/hobo/extensions/active_record/
|
271
|
-
- lib/hobo/extensions/active_record/
|
269
|
+
- lib/hobo/extensions/active_record/associations/collection.rb
|
270
|
+
- lib/hobo/extensions/active_record/associations/proxy.rb
|
271
|
+
- lib/hobo/extensions/active_record/associations/reflection.rb
|
272
|
+
- lib/hobo/extensions/active_record/associations/scope.rb
|
272
273
|
- lib/hobo/extensions/active_record/hobo_methods.rb
|
273
274
|
- lib/hobo/extensions/active_record/permissions.rb
|
274
275
|
- lib/hobo/extensions/active_record/relation_with_origin.rb
|
275
|
-
- lib/hobo/extensions/active_record/scopes.rb
|
276
276
|
- lib/hobo/extensions/array.rb
|
277
277
|
- lib/hobo/extensions/enumerable.rb
|
278
278
|
- lib/hobo/extensions/i18n.rb
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class ActiveRecord::Reflection::AssociationReflection
|
2
|
-
|
3
|
-
alias_method :association_name, :name
|
4
|
-
|
5
|
-
def klass_with_create_polymorphic_class
|
6
|
-
if options[:polymorphic]
|
7
|
-
begin
|
8
|
-
klass_without_create_polymorphic_class
|
9
|
-
rescue NameError => e
|
10
|
-
Object.class_eval "class #{e.missing_name} < ActiveRecord::Base; set_table_name '#{active_record.name.tableize}'; end"
|
11
|
-
e.missing_name.constantize
|
12
|
-
end
|
13
|
-
else
|
14
|
-
klass_without_create_polymorphic_class
|
15
|
-
end
|
16
|
-
end
|
17
|
-
alias_method_chain :klass, :create_polymorphic_class
|
18
|
-
|
19
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# Add support for :scope => :my_scope to associations
|
2
|
-
|
3
|
-
ActiveRecord::Associations::ThroughAssociationScope.class_eval do
|
4
|
-
|
5
|
-
def construct_scope_with_scope
|
6
|
-
s = construct_scope_without_scope
|
7
|
-
s[:find][:scope] = @reflection.options[:scope]
|
8
|
-
s
|
9
|
-
end
|
10
|
-
alias_method_chain :construct_scope, :scope
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
ActiveRecord::SpawnMethods.class_eval do
|
15
|
-
|
16
|
-
def apply_finder_options_with_scope(options)
|
17
|
-
scopes = []
|
18
|
-
Array.wrap(options.delete(:scope)).each do |s|
|
19
|
-
if s.is_a?(Hash)
|
20
|
-
s.each_pair{|k,v| scopes << [k,v] }
|
21
|
-
else
|
22
|
-
scopes << [s]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
relation = apply_finder_options_without_scope(options)
|
26
|
-
return relation if scopes.empty?
|
27
|
-
scopes.inject(relation) {|r, s| r.send *s }
|
28
|
-
end
|
29
|
-
alias_method_chain :apply_finder_options, :scope
|
30
|
-
|
31
|
-
end
|