validates_overlap 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZTc5NTQ4NDFlMTU1MjVkZDllOGEzNzVjYzhhYjNlY2VlODlhYzZmOA==
5
+ data.tar.gz: !binary |-
6
+ MzNmNWJiMjhjYWM4ODFmYTFhMGRhM2EyZjYwYTlkYjZlMGM2NTQwMg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NTIxNzM5ZWQ0ZjEzZDFiZGE3YWVjM2YzMzliZDgzN2E0MTdjNmFmZTlhNGQ0
10
+ M2FkOGM5ZGQ3M2JjYzc5OWNjNTVlNDg5YzIyY2U4NzUwYmVmMDZiMDMxNjhi
11
+ MzAxOTEyM2ZmZTdhZmVhYzNhOTE1Mzk1MDMyMjYxMWI3NWZjNTM=
12
+ data.tar.gz: !binary |-
13
+ YmU0MTU0MDNmMmQxMTdkYjQ5MmIzMjk1NGZkNjY1MzI3OTA3OTk1OTg0Nzg2
14
+ N2Y3NTFjZGJiODM4NTBlMzZjZmNiNjRiZTQxY2E0YjRlNDY0MjMyZGU1NDRi
15
+ MGMyM2U5Nzc4YmY2ZmJlMmY0YjBiOGY0ZTIxMzBiNGQ2NjgwYjQ=
data/.travis.yml CHANGED
@@ -1,5 +1,4 @@
1
1
  rvm:
2
- - 1.9.2
3
2
  - 1.9.3
4
3
 
5
4
 
data/Gemfile CHANGED
@@ -8,4 +8,5 @@ group :test, :development do
8
8
  gem "factory_girl_rails", '~>4.2'
9
9
  gem "bundler", '~>1.2'
10
10
  gem "jeweler", '~>1.8'
11
+ gem "pry"
11
12
  end
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ [![Build Status](https://secure.travis-ci.org/robinbortlik/validates_overlap.png?branch=master)](https://secure.travis-ci.org/robinbortlik/validates_overlap)
2
+
3
+ # ValidatesOverlap
4
+
5
+ This project rocks and uses MIT-LICENSE.
6
+
7
+ #### This gem is compatible with Rails 3 and 4.
8
+
9
+ #### When this gem should be helpful for you?
10
+ If you are developing Rails 3 app, let say some meeting planner and you can't save records which have time overlap.
11
+
12
+ #### Using
13
+
14
+ Add to your gemfile
15
+
16
+ ```ruby
17
+ gem 'validates_overlap'
18
+ ```
19
+
20
+ In your model
21
+
22
+ #### without scope
23
+
24
+ ```ruby
25
+ validates :starts_at, :ends_at, :overlap => true
26
+ ```
27
+
28
+ #### with scope
29
+
30
+ ```ruby
31
+ validates :starts_at, :ends_at, :overlap => {:scope => "user_id"}
32
+ ```
33
+
34
+ #### exclude edges
35
+
36
+ ```ruby
37
+ validates :starts_at, :ends_at, :overlap => {:exclude_edges => "starts_at"}
38
+ validates :starts_at, :ends_at, :overlap => {:exclude_edges => ["starts_at", "ends_at"]}
39
+ ```
40
+
41
+ #### define custom validation key and message
42
+
43
+ ```ruby
44
+ validates :starts_at, :ends_at, :overlap => {:message_title => "Some validation title", :message_content => "Some validation message"}
45
+ ```
46
+
47
+ #### with complicated relation relations
48
+
49
+ Example describes valildatation of user, positions and time slots.
50
+ User can't be assigned 2 times on position which is under time slot with time overlap.
51
+
52
+ ```ruby
53
+ class Position < ActiveRecord::Base
54
+ belongs_to :time_slot
55
+ belongs_to :user
56
+ validates "time_slots.starts_at", "time_slots.ends_at",
57
+ :overlap => {
58
+ :query_options => {:includes => :time_slot},
59
+ :scope => { "positions.user_id" => proc{|position| position.user_id} }
60
+ }
61
+ end
62
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
@@ -15,9 +15,9 @@ class OverlapValidator < ActiveModel::EachValidator
15
15
  def validate(record)
16
16
  if self.find_crossed(record)
17
17
  if record.respond_to? attributes.first
18
- record.errors.add(attributes.first, :overlap)
18
+ record.errors.add(options[:message_title] || attributes.first, options[:message_content] || :overlap)
19
19
  else
20
- record.errors.add(:base, :overlap)
20
+ record.errors.add(options[:message_title] || :base, options[:message_content] || :overlap)
21
21
  end
22
22
  end
23
23
  end
@@ -0,0 +1,4 @@
1
+ class ActiveMeeting < ActiveRecord::Base
2
+ validates :starts_at, :ends_at, :overlap => {:query_options => {:active => true}}
3
+ scope :active, where(:is_active => true)
4
+ end
@@ -0,0 +1,14 @@
1
+ class CreateActiveMeetings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :active_meetings do |t|
4
+ t.date :starts_at
5
+ t.date :ends_at
6
+ t.boolean :is_active
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :active_meetings
13
+ end
14
+ end
@@ -11,7 +11,15 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20121207162212) do
14
+ ActiveRecord::Schema.define(:version => 20130826155107) do
15
+
16
+ create_table "active_meetings", :force => true do |t|
17
+ t.date "starts_at"
18
+ t.date "ends_at"
19
+ t.boolean "is_active"
20
+ t.datetime "created_at", :null => false
21
+ t.datetime "updated_at", :null => false
22
+ end
15
23
 
16
24
  create_table "end_overlap_meetings", :force => true do |t|
17
25
  t.date "starts_at"
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :active_meeting do |u|
3
+ u.starts_at '2011-01-05'.to_date
4
+ u.ends_at '2011-01-08'.to_date
5
+ u.is_active true
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../factories/active_meeting'
3
+
4
+ describe ActiveMeeting do
5
+
6
+ before(:all) do
7
+ ActiveMeeting.delete_all
8
+ end
9
+
10
+ context "scoping" do
11
+ it "should apply scope" do
12
+ ActiveMeeting.should_receive(:active).with(true).and_call_original
13
+ active_meeting = ActiveMeeting.new
14
+ active_meeting.valid?
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,24 @@
1
+ describe OverlapValidator do
2
+
3
+
4
+ context "validation message" do
5
+
6
+ it "should have default message" do
7
+ subject = OverlapValidator.new({:attributes => [:starts_at, :ends_at]})
8
+ meeting = Meeting.new
9
+ subject.stub(:find_crossed){true}
10
+ subject.validate(meeting)
11
+ meeting.errors[:starts_at].should eq ["overlaps with another record"]
12
+ end
13
+
14
+ it "should be possible to configure message" do
15
+ subject = OverlapValidator.new({:attributes => [:starts_at, :ends_at]})
16
+ meeting = Meeting.new
17
+ subject.stub(:find_crossed){true}
18
+ subject.stub(:options){ {:message_title => :optional_key, :message_content => "Message content"} }
19
+ subject.validate(meeting)
20
+ meeting.errors.messages.should eq :optional_key => ["Message content"]
21
+ end
22
+
23
+ end
24
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
5
  require "rails/test_help"
6
6
  require "rspec/rails"
7
7
  require "factory_girl_rails"
8
+ require 'pry'
8
9
 
9
10
 
10
11
  ActionMailer::Base.delivery_method = :test
@@ -5,21 +5,21 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "validates_overlap"
8
- s.version = "0.1.2"
8
+ s.version = "0.1.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Robin Bortlik"]
12
- s.date = "2013-03-05"
12
+ s.date = "2013-08-26"
13
13
  s.description = "It can be useful when you you are developing some app where you will work with meetings, events etc."
14
14
  s.email = "robinbortlik@gmail.com"
15
15
  s.extra_rdoc_files = [
16
- "README.rdoc"
16
+ "README.md"
17
17
  ]
18
18
  s.files = [
19
19
  ".travis.yml",
20
20
  "Gemfile",
21
21
  "MIT-LICENSE",
22
- "README.rdoc",
22
+ "README.md",
23
23
  "Rakefile",
24
24
  "VERSION",
25
25
  "lib/validates_overlap.rb",
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  "spec/dummy/Rakefile",
29
29
  "spec/dummy/app/controllers/application_controller.rb",
30
30
  "spec/dummy/app/helpers/application_helper.rb",
31
+ "spec/dummy/app/models/active_meeting.rb",
31
32
  "spec/dummy/app/models/end_overlap_meeting.rb",
32
33
  "spec/dummy/app/models/meeting.rb",
33
34
  "spec/dummy/app/models/position.rb",
@@ -59,6 +60,7 @@ Gem::Specification.new do |s|
59
60
  "spec/dummy/db/migrate/20120509131012_create_start_overlap_meetings.rb",
60
61
  "spec/dummy/db/migrate/20120509131032_create_start_end_overlap_meetings.rb",
61
62
  "spec/dummy/db/migrate/20121207162212_create_time_slot.rb",
63
+ "spec/dummy/db/migrate/20130826155107_create_active_meetings.rb",
62
64
  "spec/dummy/db/schema.rb",
63
65
  "spec/dummy/public/404.html",
64
66
  "spec/dummy/public/422.html",
@@ -72,6 +74,7 @@ Gem::Specification.new do |s|
72
74
  "spec/dummy/public/javascripts/rails.js",
73
75
  "spec/dummy/public/stylesheets/.gitkeep",
74
76
  "spec/dummy/script/rails",
77
+ "spec/dummy/spec/factories/active_meeting.rb",
75
78
  "spec/dummy/spec/factories/end_overlap_meeting.rb",
76
79
  "spec/dummy/spec/factories/meeting.rb",
77
80
  "spec/dummy/spec/factories/position.rb",
@@ -80,6 +83,7 @@ Gem::Specification.new do |s|
80
83
  "spec/dummy/spec/factories/time_slot.rb",
81
84
  "spec/dummy/spec/factories/user.rb",
82
85
  "spec/dummy/spec/factories/user_meeting.rb",
86
+ "spec/dummy/spec/models/active_meetings_spec.rb",
83
87
  "spec/dummy/spec/models/end_overlap_meeting_spec.rb",
84
88
  "spec/dummy/spec/models/meeting_spec.rb",
85
89
  "spec/dummy/spec/models/position_spec.rb",
@@ -88,17 +92,18 @@ Gem::Specification.new do |s|
88
92
  "spec/dummy/spec/models/time_slot_spec.rb",
89
93
  "spec/dummy/spec/models/user_meeting_spec.rb",
90
94
  "spec/dummy/spec/models/user_spec.rb",
95
+ "spec/dummy/spec/overlap_validator_spec.rb",
91
96
  "spec/spec_helper.rb",
92
97
  "validates_overlap.gemspec"
93
98
  ]
94
99
  s.homepage = "http://github.com/robinbortlik/validates_overlap"
95
100
  s.licenses = ["MIT"]
96
101
  s.require_paths = ["lib"]
97
- s.rubygems_version = "1.8.24"
102
+ s.rubygems_version = "2.0.6"
98
103
  s.summary = "This gem helps validate records with time overlap."
99
104
 
100
105
  if s.respond_to? :specification_version then
101
- s.specification_version = 3
106
+ s.specification_version = 4
102
107
 
103
108
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
104
109
  s.add_runtime_dependency(%q<rails>, [">= 3.0.0"])
@@ -107,6 +112,7 @@ Gem::Specification.new do |s|
107
112
  s.add_development_dependency(%q<factory_girl_rails>, ["~> 4.2"])
108
113
  s.add_development_dependency(%q<bundler>, ["~> 1.2"])
109
114
  s.add_development_dependency(%q<jeweler>, ["~> 1.8"])
115
+ s.add_development_dependency(%q<pry>, [">= 0"])
110
116
  else
111
117
  s.add_dependency(%q<rails>, [">= 3.0.0"])
112
118
  s.add_dependency(%q<sqlite3>, ["~> 1.3"])
@@ -114,6 +120,7 @@ Gem::Specification.new do |s|
114
120
  s.add_dependency(%q<factory_girl_rails>, ["~> 4.2"])
115
121
  s.add_dependency(%q<bundler>, ["~> 1.2"])
116
122
  s.add_dependency(%q<jeweler>, ["~> 1.8"])
123
+ s.add_dependency(%q<pry>, [">= 0"])
117
124
  end
118
125
  else
119
126
  s.add_dependency(%q<rails>, [">= 3.0.0"])
@@ -122,6 +129,7 @@ Gem::Specification.new do |s|
122
129
  s.add_dependency(%q<factory_girl_rails>, ["~> 4.2"])
123
130
  s.add_dependency(%q<bundler>, ["~> 1.2"])
124
131
  s.add_dependency(%q<jeweler>, ["~> 1.8"])
132
+ s.add_dependency(%q<pry>, [">= 0"])
125
133
  end
126
134
  end
127
135
 
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_overlap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
5
- prerelease:
4
+ version: 0.1.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Robin Bortlik
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-05 00:00:00.000000000 Z
11
+ date: 2013-08-26 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: sqlite3
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec-rails
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: factory_girl_rails
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: bundler
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: jeweler
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,23 +90,36 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
109
96
  version: '1.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
110
111
  description: It can be useful when you you are developing some app where you will
111
112
  work with meetings, events etc.
112
113
  email: robinbortlik@gmail.com
113
114
  executables: []
114
115
  extensions: []
115
116
  extra_rdoc_files:
116
- - README.rdoc
117
+ - README.md
117
118
  files:
118
119
  - .travis.yml
119
120
  - Gemfile
120
121
  - MIT-LICENSE
121
- - README.rdoc
122
+ - README.md
122
123
  - Rakefile
123
124
  - VERSION
124
125
  - lib/validates_overlap.rb
@@ -127,6 +128,7 @@ files:
127
128
  - spec/dummy/Rakefile
128
129
  - spec/dummy/app/controllers/application_controller.rb
129
130
  - spec/dummy/app/helpers/application_helper.rb
131
+ - spec/dummy/app/models/active_meeting.rb
130
132
  - spec/dummy/app/models/end_overlap_meeting.rb
131
133
  - spec/dummy/app/models/meeting.rb
132
134
  - spec/dummy/app/models/position.rb
@@ -158,6 +160,7 @@ files:
158
160
  - spec/dummy/db/migrate/20120509131012_create_start_overlap_meetings.rb
159
161
  - spec/dummy/db/migrate/20120509131032_create_start_end_overlap_meetings.rb
160
162
  - spec/dummy/db/migrate/20121207162212_create_time_slot.rb
163
+ - spec/dummy/db/migrate/20130826155107_create_active_meetings.rb
161
164
  - spec/dummy/db/schema.rb
162
165
  - spec/dummy/public/404.html
163
166
  - spec/dummy/public/422.html
@@ -171,6 +174,7 @@ files:
171
174
  - spec/dummy/public/javascripts/rails.js
172
175
  - spec/dummy/public/stylesheets/.gitkeep
173
176
  - spec/dummy/script/rails
177
+ - spec/dummy/spec/factories/active_meeting.rb
174
178
  - spec/dummy/spec/factories/end_overlap_meeting.rb
175
179
  - spec/dummy/spec/factories/meeting.rb
176
180
  - spec/dummy/spec/factories/position.rb
@@ -179,6 +183,7 @@ files:
179
183
  - spec/dummy/spec/factories/time_slot.rb
180
184
  - spec/dummy/spec/factories/user.rb
181
185
  - spec/dummy/spec/factories/user_meeting.rb
186
+ - spec/dummy/spec/models/active_meetings_spec.rb
182
187
  - spec/dummy/spec/models/end_overlap_meeting_spec.rb
183
188
  - spec/dummy/spec/models/meeting_spec.rb
184
189
  - spec/dummy/spec/models/position_spec.rb
@@ -187,34 +192,31 @@ files:
187
192
  - spec/dummy/spec/models/time_slot_spec.rb
188
193
  - spec/dummy/spec/models/user_meeting_spec.rb
189
194
  - spec/dummy/spec/models/user_spec.rb
195
+ - spec/dummy/spec/overlap_validator_spec.rb
190
196
  - spec/spec_helper.rb
191
197
  - validates_overlap.gemspec
192
198
  homepage: http://github.com/robinbortlik/validates_overlap
193
199
  licenses:
194
200
  - MIT
201
+ metadata: {}
195
202
  post_install_message:
196
203
  rdoc_options: []
197
204
  require_paths:
198
205
  - lib
199
206
  required_ruby_version: !ruby/object:Gem::Requirement
200
- none: false
201
207
  requirements:
202
208
  - - ! '>='
203
209
  - !ruby/object:Gem::Version
204
210
  version: '0'
205
- segments:
206
- - 0
207
- hash: 2932668315205371865
208
211
  required_rubygems_version: !ruby/object:Gem::Requirement
209
- none: false
210
212
  requirements:
211
213
  - - ! '>='
212
214
  - !ruby/object:Gem::Version
213
215
  version: '0'
214
216
  requirements: []
215
217
  rubyforge_project:
216
- rubygems_version: 1.8.24
218
+ rubygems_version: 2.0.6
217
219
  signing_key:
218
- specification_version: 3
220
+ specification_version: 4
219
221
  summary: This gem helps validate records with time overlap.
220
222
  test_files: []
data/README.rdoc DELETED
@@ -1,47 +0,0 @@
1
- {<img src="https://secure.travis-ci.org/robinbortlik/validates_overlap.png?branch=master" alt="Build Status" />}[http://travis-ci.org/robinbortlik/validates_overlap]
2
-
3
- = ValidatesOverlap
4
-
5
- This project rocks and uses MIT-LICENSE.
6
-
7
- === This gem is available only for Rails 3.
8
-
9
- === When this gem should be helpful for you?
10
- If you are developing Rails 3 app, let say some meeting planner and you can't save records which have time overlap.
11
-
12
- === Using
13
-
14
- Add to your gemfile
15
- gem 'validates_overlap'
16
-
17
-
18
- In your model
19
-
20
- without scope
21
- validates :starts_at, :ends_at, :overlap => true
22
-
23
-
24
- with scope
25
- validates :starts_at, :ends_at, :overlap => {:scope => "user_id"}
26
-
27
-
28
- exclude edges
29
- validates :starts_at, :ends_at, :overlap => {:exclude_edges => "starts_at"}
30
- validates :starts_at, :ends_at, :overlap => {:exclude_edges => ["starts_at", "ends_at"]}
31
-
32
-
33
- with complicated relation relations
34
-
35
- Exaple describes valildatation of user, positions and time slots.
36
- User can't be assigned 2 times on position which is under time slot with time overlap.
37
-
38
-
39
- class Position < ActiveRecord::Base
40
- belongs_to :time_slot
41
- belongs_to :user
42
- validates "time_slots.starts_at", "time_slots.ends_at",
43
- :overlap => {
44
- :query_options => {:includes => :time_slot},
45
- :scope => { "positions.user_id" => proc{|position| position.user_id} }
46
- }
47
- end