active_record_samplooper 0.0.4 → 0.0.6
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/Gemfile.lock +1 -1
- data/README.md +120 -1
- data/lib/active_record_samplooper.rb +14 -9
- data/lib/active_record_samplooper/version.rb +1 -1
- data/spec/models/sample_model_spec.rb +27 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a6fc2ce8bdbe8e29e1c01a4d10244b54cc105e6
|
4
|
+
data.tar.gz: ccdc37e1c5d8f6307e405efdfda20b3fd0068b8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 338b2826f9e46c468e7849b658344531e81b625e549ab1848756b71d8170e0b2dbce2991f5dab58f99bfcc94c02b085f81b455ede0b32746f3c9d3b6f9274824
|
7
|
+
data.tar.gz: 2ed837bad209238a913e839abdb5326512f511327dbb52f48e65f0b5812f7b4cbb55dff3aebc4651d4e1b36d49c8f027609404b9c22f390ddd4c6ce076bbf11f
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,2 +1,121 @@
|
|
1
1
|
[](https://travis-ci.org/mmmpa/active_record_samplooper)
|
2
|
-
[](https://coveralls.io/r/mmmpa/active_record_samplooper?branch=master)
|
2
|
+
[](https://coveralls.io/r/mmmpa/active_record_samplooper?branch=master)
|
3
|
+
|
4
|
+
# ActiveRecordSamplooper
|
5
|
+
|
6
|
+
ActiveRecordSamplooperはArray#sampleをActiveRecordでもやりたくて書かれました。
|
7
|
+
|
8
|
+
おもにテストデータ作成に使っています。
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
SampleModel.sample
|
12
|
+
=> #<SampleModel:0x007ff4e2077068 id: 40, ast_name: "松尾", first_name: "寛治", last_name_reading: "まつお", first_name_reading: "かんじ", email: "matsuo_kanji@example.com", gender: "male", age: 74, birth: Wed, 26 Jun 1940, tel: "090-">
|
13
|
+
```
|
14
|
+
あるいは
|
15
|
+
```ruby
|
16
|
+
SampleModel.sample(3)
|
17
|
+
=> [
|
18
|
+
#<SampleModel:0x007fb73ec99030 id: 16, last_name: "七瀬", first_name: "希", last_name_reading: "ななせ", first_name_reading: "のぞみ", email: "nanase_nozomi@example.com", gender: "female", age: 64, birth: Tue, 23 Jan 1951, tel: "080-9991-7001">,
|
19
|
+
#<SampleModel:0x007fb73d78c9f8 id: 29, last_name: "長谷部", first_name: "樹里", last_name_reading: "はせべ", first_name_reading: "じゅり", email: "hasebe_juri@example.com", gender: "female", age: 43, birth: Sat, 09 Oct 1971, tel: "090-4943-9297">,
|
20
|
+
#<SampleModel:0x007fb73d786d00 id: 29, last_name: "長谷部", first_name: "樹里", last_name_reading: "はせべ", first_name_reading: "じゅり", email: "hasebe_juri@example.com", gender: "female", age: 43, birth: Sat, 09 Oct 1971, tel: "090-4943-9297">
|
21
|
+
]
|
22
|
+
```
|
23
|
+
`where`で絞って
|
24
|
+
```ruby
|
25
|
+
SampleModel.where(gender: :male).sample(10).map{|m| [m.first_name, m.gender].join(' : ')}
|
26
|
+
=> ["洋介 : male", "勇一 : male", "良介 : male", "晃司 : male", "仁晶 : male", "良介 : male", "一樹 : male", "明 : male", "禄郎 : male", "晃司 : male"]
|
27
|
+
```
|
28
|
+
ただしダイレクトに`sample`するより(Samplooper)[#Samplooper]を介した方がよさそう。
|
29
|
+
|
30
|
+
## Installation
|
31
|
+
```ruby
|
32
|
+
gem 'active_record_samplooper'
|
33
|
+
```
|
34
|
+
$ bundle install
|
35
|
+
|
36
|
+
## Usage
|
37
|
+
|
38
|
+
`Samplooper`を介すと軽かったり多少便利だったりします。
|
39
|
+
|
40
|
+
***
|
41
|
+
|
42
|
+
### Samplooper
|
43
|
+
|
44
|
+
直接の`sample`のほかに、`sampler`メソッドで`Samplooper`インスタンスを取得、`Samplooper#sample` `Samplooper#pick` `Samplooper#loop`が行えます。
|
45
|
+
それぞれ引数に1以上の整数をとり、1の場合はレコードを、2以上の場合はレコードを含む配列を返します。
|
46
|
+
* **sample(n = 1)**
|
47
|
+
先行取得したidたちを元にレコードを取得。被りあり。
|
48
|
+
* **pick(n = 1)**
|
49
|
+
先行取得したidたちを元にレコードを取得。各レコードは1度のみ出現する。1周すると`nil`が帰ってくる。
|
50
|
+
* **loop(n = 1)**
|
51
|
+
先行取得したidたちを元にレコードを取得。各レコードは1周に1度のみ出現する。
|
52
|
+
|
53
|
+
***
|
54
|
+
|
55
|
+
### sample
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
sampler = SampleModel.limit(3).sampler
|
59
|
+
sampler.sample.id
|
60
|
+
=> 3
|
61
|
+
sampler.sample.id
|
62
|
+
=> 1
|
63
|
+
sampler.sample(15).map(&:id)
|
64
|
+
=> [3, 3, 2, 3, 1, 3, 3, 3, 1, 3, 1, 3, 2, 1, 1]
|
65
|
+
```
|
66
|
+
|
67
|
+
***
|
68
|
+
|
69
|
+
### pick
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
sampler = SampleModel.limit(3).sampler
|
73
|
+
sampler.pick(5).map{ |m| m.try(:id)}
|
74
|
+
=> [2, 1, 3, nil, nil]
|
75
|
+
|
76
|
+
sampler = SampleModel.limit(3).sampler
|
77
|
+
sampler.pick.id
|
78
|
+
=> 1
|
79
|
+
sampler.pick(5).map{ |m| m.try(:id)}
|
80
|
+
=> [2, 3, nil, nil, nil]
|
81
|
+
```
|
82
|
+
|
83
|
+
***
|
84
|
+
|
85
|
+
### loop
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
sampler = SampleModel.limit(3).sampler
|
89
|
+
sampler.loop.id
|
90
|
+
=> 2
|
91
|
+
sampler.loop.id
|
92
|
+
=> 1
|
93
|
+
sampler.loop.id
|
94
|
+
=> 3
|
95
|
+
sampler.loop(15).map(&:id)
|
96
|
+
=> [
|
97
|
+
3, 1, 2,
|
98
|
+
1, 3, 2,
|
99
|
+
3, 1, 2,
|
100
|
+
1, 2, 3,
|
101
|
+
2, 3, 1
|
102
|
+
]
|
103
|
+
```
|
104
|
+
|
105
|
+
***
|
106
|
+
|
107
|
+
`where`とかも併用できます。
|
108
|
+
```ruby
|
109
|
+
SampleModel.where(gender: :male).sample(10).map{|m| [m.first_name, m.gender].join(' : ')}
|
110
|
+
=> ["洋介 : male", "勇一 : male", "良介 : male", "晃司 : male", "仁晶 : male", "良介 : male", "一樹 : male", "明 : male", "禄郎 : male", "晃司 : male"]
|
111
|
+
```
|
112
|
+
上は毎回ActiveRecord_Relation取ってくるのでちょっと遅いので`sampler`でidを先行取得して`sample`するとちょっと早い。
|
113
|
+
```ruby
|
114
|
+
sampler = SampleModel.where(gender: :male).sampler
|
115
|
+
sampler.sample(10).map{|m| [m.first_name, m.gender].join(' : ')}
|
116
|
+
=> ["悟志 : male", "良介 : male", "慎之介 : male", "寛治 : male", "浩正 : male", "隆之介 : male", "禄郎 : male", "浩正 : male", "一樹 : male", "良介 : male"]
|
117
|
+
```
|
118
|
+
|
119
|
+
## License
|
120
|
+
|
121
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -55,17 +55,17 @@ module ActiveRecordSamplooper
|
|
55
55
|
|
56
56
|
|
57
57
|
def sample(count = 1)
|
58
|
-
count > 1 ? count.times.map {
|
58
|
+
count > 1 ? count.times.map { do_sampling } : do_sampling
|
59
59
|
end
|
60
60
|
|
61
61
|
|
62
62
|
def pick(count = 1)
|
63
|
-
count > 1 ? count.times.map {
|
63
|
+
count > 1 ? count.times.map { do_picking } : do_picking
|
64
64
|
end
|
65
65
|
|
66
66
|
|
67
67
|
def loop(count = 1)
|
68
|
-
count > 1 ? count.times.map {
|
68
|
+
count > 1 ? count.times.map { do_looping } : do_looping
|
69
69
|
end
|
70
70
|
|
71
71
|
|
@@ -76,23 +76,23 @@ module ActiveRecordSamplooper
|
|
76
76
|
|
77
77
|
|
78
78
|
def reset!
|
79
|
-
self.rest = id_store.dup
|
79
|
+
self.rest = id_store.dup.shuffle
|
80
80
|
end
|
81
81
|
|
82
82
|
|
83
83
|
private
|
84
|
-
def
|
84
|
+
def do_sampling
|
85
85
|
find(id_store.sample)
|
86
86
|
end
|
87
87
|
|
88
88
|
|
89
|
-
def
|
89
|
+
def do_picking
|
90
90
|
return if rest.blank?
|
91
91
|
find(rest.shift)
|
92
92
|
end
|
93
93
|
|
94
94
|
|
95
|
-
def
|
95
|
+
def do_looping
|
96
96
|
reset! if rest.blank?
|
97
97
|
pick
|
98
98
|
end
|
@@ -118,13 +118,18 @@ end
|
|
118
118
|
|
119
119
|
class ::ActiveRecord::Base
|
120
120
|
class << self
|
121
|
-
def sample
|
122
|
-
|
121
|
+
def sample(count = 1)
|
122
|
+
count > 1 ? count.times.map { do_sampling } : do_sampling
|
123
123
|
end
|
124
124
|
|
125
125
|
|
126
126
|
def sampler
|
127
127
|
ActiveRecordSamplooper.(self)
|
128
128
|
end
|
129
|
+
|
130
|
+
private
|
131
|
+
def do_sampling
|
132
|
+
offset(rand(count(:all))).first
|
133
|
+
end
|
129
134
|
end
|
130
135
|
end
|
@@ -34,7 +34,7 @@ RSpec.describe SampleModel, type: :model do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
it '
|
37
|
+
it 'pick get once each' do
|
38
38
|
10.times { expect(sampler.pick).to be_a(SampleModel) }
|
39
39
|
expect(sampler.pick).to be_nil
|
40
40
|
end
|
@@ -70,6 +70,32 @@ RSpec.describe SampleModel, type: :model do
|
|
70
70
|
new_id = create(:sample_model).id
|
71
71
|
1000.times { expect(sampler.sample.id).not_to eq(new_id) }
|
72
72
|
end
|
73
|
+
|
74
|
+
context 'fixnum parameter get multiple element' do
|
75
|
+
it 'pick(n) get multiple element' do
|
76
|
+
re = sampler.pick(3)
|
77
|
+
expect(re.size).to eq(3)
|
78
|
+
re.each do |element|
|
79
|
+
expect(element).to be_a(SampleModel)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'loop(n) get multiple element' do
|
84
|
+
re = sampler.loop(3)
|
85
|
+
expect(re.size).to eq(3)
|
86
|
+
re.each do |element|
|
87
|
+
expect(element).to be_a(SampleModel)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'sample(n) get multiple element' do
|
92
|
+
re = sampler.sample(3)
|
93
|
+
expect(re.size).to eq(3)
|
94
|
+
re.each do |element|
|
95
|
+
expect(element).to be_a(SampleModel)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
73
99
|
end
|
74
100
|
end
|
75
101
|
|