most_related 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d1a63ce584fc9c15f6c22b779faa18ed0b282c97
4
- data.tar.gz: 2c658856e11fd8ae33e2577f6e31ebd8483f086d
3
+ metadata.gz: b655ee05c62fde06ac5da9dbb806d5b2d46aa2e8
4
+ data.tar.gz: b716b9ac1370e5fa5f31a1cb6c12a3fa0267c397
5
5
  SHA512:
6
- metadata.gz: 2c37efcfe4ff80b99537a3629e76eb62d75fd5625cbf04fb14e5eb11b4815b24c846f7c60af719f02770c0b15e48394ba8994c9a8b5222266b5331ca75a42e43
7
- data.tar.gz: 694fd16398d5a0a46eb39407f6ecdd70608dda4fd83ea072b79c0d8db39d88e96438d1f707890975469bdefffd9dc9c89524da2a1885fde2a929b07637f764a3
6
+ metadata.gz: 652d59f88d1a0dfbf6b782dbfa6c9b4cd6d5b61d6eb812470aa5398771ec63f9b53f145a981d03c7d8bfbac1c087da72f73abada3fc2bd42b34ee7f61374ac32
7
+ data.tar.gz: bd8d55d28bb3c534d440d41a5f447994ccc10ec5439730ed2434900fcc4e27d80134e1001a2080debefeb83e9aeaae3c5a03ba6c25c36d1890ed7274fd8a0664
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0-p247
1
+ 2.2.2
data/README.md CHANGED
@@ -54,9 +54,10 @@ The count of the many to many associated models in common is accessible on each
54
54
 
55
55
  post.most_related_count
56
56
  post.most_related_by_tag_count
57
- post.most_related_by_author_or_tag
57
+ post.most_related_by_author_or_tag_count
58
58
 
59
- If multiple many to many associations are used, the syntax is specific to MySql.
59
+ If multiple many to many associations are used, the syntax is specific to MySql although
60
+ it could be made to work with Postgres.
60
61
 
61
62
  Because of the use of 'group', pagination is not supported.
62
63
 
@@ -1,3 +1,3 @@
1
1
  module MostRelated
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/most_related.rb CHANGED
@@ -35,7 +35,7 @@ module MostRelated
35
35
  # post.most_related_by_author_or_tag
36
36
  #
37
37
  # The count of the many to many associated models in common is accessible on each returned model
38
- # eg post.most_related_count, post.most_related_by_tag_count and post.most_related_by_author_or_tag
38
+ # eg post.most_related_count, post.most_related_by_tag_count and post.most_related_by_author_or_tag_count
39
39
  #
40
40
  def has_most_related(many_to_many_associations, as: :most_related)
41
41
 
@@ -60,6 +60,8 @@ module MostRelated
60
60
  joins("INNER JOIN #{join_table} ON #{join_table}.#{foreign_key} = #{table_name}.id")
61
61
  end
62
62
 
63
+ # with postgres, multiple many-to-many associations doesn't work and here's why
64
+ # http://dba.stackexchange.com/questions/88988/postgres-error-column-must-appear-in-the-group-by-clause-or-be-used-in-an-aggre
63
65
  scope = self.class.select("#{table_name}.*, count(#{table_name}.id) AS #{as}_count").
64
66
  where.not(id: self.id).group("#{table_name}.id").order("#{as}_count DESC")
65
67
 
@@ -68,7 +70,7 @@ module MostRelated
68
70
  scope.merge(association_scopes.first)
69
71
  else
70
72
  # see http://blog.ubersense.com/2013/09/27/tech-talk-unioning-scoped-queries-in-rails/
71
- scope.from("((#{association_scopes.map(&:to_sql).join(') UNION ALL (')})) #{table_name}")
73
+ scope.from("((#{association_scopes.map(&:to_sql).join(') UNION ALL (')})) AS #{table_name}")
72
74
  end
73
75
  end
74
76
 
@@ -88,4 +90,4 @@ module MostRelated
88
90
  end
89
91
 
90
92
  # Extend ActiveRecord functionality
91
- ActiveRecord::Base.extend MostRelated
93
+ ActiveRecord::Base.extend MostRelated
data/most_related.gemspec CHANGED
@@ -7,9 +7,9 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "most_related"
8
8
  spec.version = MostRelated::VERSION
9
9
  spec.authors = ["Jolyon Pawlyn"]
10
- spec.email = ["jolyon.pawlyn@unboxedconsulting.com"]
11
- spec.description = %q{Adds an instance method to a active record model that returns the most related models based on many to many associated models in common}
12
- spec.summary = %q{Returns models that have the most many to many associated models in common}
10
+ spec.email = ["jpawlyn@gmail.com"]
11
+ spec.description = %q{Adds an instance method to a active record model that returns the most related models based on associated models in common}
12
+ spec.summary = %q{Returns models that have the most associated models in common}
13
13
  spec.homepage = "https://github.com/jpawlyn/most_related"
14
14
  spec.license = "MIT"
15
15
 
@@ -18,8 +18,13 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
22
- spec.add_development_dependency "rspec", "~> 2.14.1"
23
- spec.add_development_dependency "activerecord", "~> 4.0.0"
24
- spec.add_development_dependency "sqlite3"
21
+ spec.required_ruby_version = '>= 1.9.3'
22
+ spec.add_runtime_dependency 'activerecord', '~> 4.0', '>= 4.0.0'
23
+ spec.add_development_dependency 'bundler', '~> 1.3'
24
+ spec.add_development_dependency 'rspec', '~> 2.14', '>= 2.14.1'
25
+ spec.add_development_dependency 'database_cleaner', '~>1.4'
26
+ spec.add_development_dependency 'sqlite3', '~>1.3'
27
+ spec.add_development_dependency 'mysql2', '~>0.3'
28
+ spec.add_development_dependency 'pg', '~>0.18'
29
+ spec.add_development_dependency 'byebug', '~>4.0'
25
30
  end
data/spec/post_spec.rb CHANGED
@@ -37,30 +37,16 @@ describe Post do
37
37
  end
38
38
 
39
39
  context "combination of 'has_many through:' and habtm" do
40
- let(:post) { Post.create! authors: [author1, author2, author3], tags: [tag1, tag2, tag3] }
41
- let(:post1) { Post.create! authors: [author1, author2, author3], tags: [tag1, tag2, tag4] }
42
- let(:post2) { Post.create! authors: [author1, author4] }
43
- let(:post3) { Post.create! tags: [tag4] }
44
- let(:post4) { Post.create! authors: [author1], tags: [tag1, tag2, tag3] }
40
+ let!(:post) { Post.create! authors: [author1, author2, author3], tags: [tag1, tag2, tag3] }
41
+ let!(:post1) { Post.create! authors: [author1, author2, author3], tags: [tag1, tag2, tag4] }
42
+ let!(:post2) { Post.create! authors: [author1, author4] }
43
+ let!(:post3) { Post.create! tags: [tag4] }
44
+ let!(:post4) { Post.create! authors: [author1], tags: [tag1, tag2, tag3] }
45
45
 
46
46
  it 'return posts that have the most authors and tags in common with post' do
47
- pending 'Does not work with sqlite - mysql only perhaps?'
47
+ # note, this test currently only passes with MySQL
48
48
  expect(post.most_related_by_author_or_tag.map(&:most_related_by_author_or_tag_count)).to eq([5, 4, 1])
49
49
  expect(post.most_related_by_author_or_tag).to eq([post1, post4, post2])
50
50
  end
51
-
52
- it 'sql check' do
53
- expect(post.most_related_by_author_or_tag.where_clauses).to eq(["(\"posts\".\"id\" != #{post.id})"])
54
- expect(post.most_related_by_author_or_tag.order_clauses).to eq(["most_related_by_author_or_tag_count DESC"])
55
- sql = <<-eos
56
- SELECT posts.*, count(posts.id) AS most_related_by_author_or_tag_count FROM
57
- ((SELECT \"posts\".* FROM \"posts\" INNER JOIN author_posts ON author_posts.post_id = posts.id WHERE
58
- (author_posts.author_id IN (select author_posts.author_id from author_posts where author_posts.post_id = #{post.id})))
59
- UNION ALL (SELECT \"posts\".* FROM \"posts\" INNER JOIN posts_tags ON posts_tags.post_id = posts.id WHERE
60
- (posts_tags.tag_id IN (select posts_tags.tag_id from posts_tags where posts_tags.post_id = #{post.id})))) posts
61
- WHERE (\"posts\".\"id\" != #{post.id}) GROUP BY posts.id ORDER BY most_related_by_author_or_tag_count DESC
62
- eos
63
- expect(post.most_related_by_author_or_tag.to_sql.squish!).to eq(sql.squish!)
64
- end
65
51
  end
66
52
  end
data/spec/spec_helper.rb CHANGED
@@ -6,13 +6,18 @@
6
6
 
7
7
  # see http://blog.markstarkman.com/blog/2013/01/23/using-sqlite-to-test-active-record-models/
8
8
  require 'active_record'
9
- ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
9
+
10
+ ActiveRecord::Base.establish_connection adapter: 'mysql2', database: 'most_related'
11
+ # ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
12
+ # ActiveRecord::Base.establish_connection adapter: 'postgresql', database: 'most_related'
10
13
  load 'support/schema.rb'
11
14
 
12
15
  require 'most_related'
13
16
  require 'support/models'
14
- require 'support/string'
17
+ require 'database_cleaner'
18
+ require 'byebug'
15
19
 
20
+ DatabaseCleaner.strategy = :transaction
16
21
 
17
22
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
18
23
  RSpec.configure do |config|
@@ -25,4 +30,12 @@ RSpec.configure do |config|
25
30
  # the seed, which is printed after each run.
26
31
  # --seed 1234
27
32
  config.order = 'random'
33
+
34
+ config.before :each do
35
+ DatabaseCleaner.start
36
+ end
37
+
38
+ config.after :each do
39
+ DatabaseCleaner.clean
40
+ end
28
41
  end
@@ -2,17 +2,17 @@ ActiveRecord::Schema.define do
2
2
  self.verbose = false
3
3
 
4
4
  create_table :authors, force: true do |t|
5
- t.timestamps
5
+ t.timestamps null: false
6
6
  end
7
7
 
8
8
  create_table :author_posts, force: true do |t|
9
9
  t.integer :author_id, null: false
10
10
  t.integer :post_id, null: false
11
- t.timestamps
11
+ t.timestamps null: false
12
12
  end
13
13
 
14
14
  create_table :posts, force: true do |t|
15
- t.timestamps
15
+ t.timestamps null: false
16
16
  end
17
17
 
18
18
  create_table :posts_tags, force: true do |t|
metadata CHANGED
@@ -1,82 +1,150 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: most_related
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jolyon Pawlyn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-09 00:00:00.000000000 Z
11
+ date: 2015-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 4.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '4.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 4.0.0
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: bundler
15
35
  requirement: !ruby/object:Gem::Requirement
16
36
  requirements:
17
- - - ~>
37
+ - - "~>"
18
38
  - !ruby/object:Gem::Version
19
39
  version: '1.3'
20
40
  type: :development
21
41
  prerelease: false
22
42
  version_requirements: !ruby/object:Gem::Requirement
23
43
  requirements:
24
- - - ~>
44
+ - - "~>"
25
45
  - !ruby/object:Gem::Version
26
46
  version: '1.3'
27
47
  - !ruby/object:Gem::Dependency
28
48
  name: rspec
29
49
  requirement: !ruby/object:Gem::Requirement
30
50
  requirements:
31
- - - ~>
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.14'
54
+ - - ">="
32
55
  - !ruby/object:Gem::Version
33
56
  version: 2.14.1
34
57
  type: :development
35
58
  prerelease: false
36
59
  version_requirements: !ruby/object:Gem::Requirement
37
60
  requirements:
38
- - - ~>
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '2.14'
64
+ - - ">="
39
65
  - !ruby/object:Gem::Version
40
66
  version: 2.14.1
41
67
  - !ruby/object:Gem::Dependency
42
- name: activerecord
68
+ name: database_cleaner
43
69
  requirement: !ruby/object:Gem::Requirement
44
70
  requirements:
45
- - - ~>
71
+ - - "~>"
46
72
  - !ruby/object:Gem::Version
47
- version: 4.0.0
73
+ version: '1.4'
48
74
  type: :development
49
75
  prerelease: false
50
76
  version_requirements: !ruby/object:Gem::Requirement
51
77
  requirements:
52
- - - ~>
78
+ - - "~>"
53
79
  - !ruby/object:Gem::Version
54
- version: 4.0.0
80
+ version: '1.4'
55
81
  - !ruby/object:Gem::Dependency
56
82
  name: sqlite3
57
83
  requirement: !ruby/object:Gem::Requirement
58
84
  requirements:
59
- - - '>='
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.3'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '1.3'
95
+ - !ruby/object:Gem::Dependency
96
+ name: mysql2
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '0.3'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '0.3'
109
+ - !ruby/object:Gem::Dependency
110
+ name: pg
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '0.18'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '0.18'
123
+ - !ruby/object:Gem::Dependency
124
+ name: byebug
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
60
128
  - !ruby/object:Gem::Version
61
- version: '0'
129
+ version: '4.0'
62
130
  type: :development
63
131
  prerelease: false
64
132
  version_requirements: !ruby/object:Gem::Requirement
65
133
  requirements:
66
- - - '>='
134
+ - - "~>"
67
135
  - !ruby/object:Gem::Version
68
- version: '0'
136
+ version: '4.0'
69
137
  description: Adds an instance method to a active record model that returns the most
70
- related models based on many to many associated models in common
138
+ related models based on associated models in common
71
139
  email:
72
- - jolyon.pawlyn@unboxedconsulting.com
140
+ - jpawlyn@gmail.com
73
141
  executables: []
74
142
  extensions: []
75
143
  extra_rdoc_files: []
76
144
  files:
77
- - .gitignore
78
- - .rspec
79
- - .ruby-version
145
+ - ".gitignore"
146
+ - ".rspec"
147
+ - ".ruby-version"
80
148
  - Gemfile
81
149
  - LICENSE.txt
82
150
  - README.md
@@ -88,7 +156,6 @@ files:
88
156
  - spec/spec_helper.rb
89
157
  - spec/support/models.rb
90
158
  - spec/support/schema.rb
91
- - spec/support/string.rb
92
159
  homepage: https://github.com/jpawlyn/most_related
93
160
  licenses:
94
161
  - MIT
@@ -99,23 +166,22 @@ require_paths:
99
166
  - lib
100
167
  required_ruby_version: !ruby/object:Gem::Requirement
101
168
  requirements:
102
- - - '>='
169
+ - - ">="
103
170
  - !ruby/object:Gem::Version
104
- version: '0'
171
+ version: 1.9.3
105
172
  required_rubygems_version: !ruby/object:Gem::Requirement
106
173
  requirements:
107
- - - '>='
174
+ - - ">="
108
175
  - !ruby/object:Gem::Version
109
176
  version: '0'
110
177
  requirements: []
111
178
  rubyforge_project:
112
- rubygems_version: 2.0.3
179
+ rubygems_version: 2.4.5
113
180
  signing_key:
114
181
  specification_version: 4
115
- summary: Returns models that have the most many to many associated models in common
182
+ summary: Returns models that have the most associated models in common
116
183
  test_files:
117
184
  - spec/post_spec.rb
118
185
  - spec/spec_helper.rb
119
186
  - spec/support/models.rb
120
187
  - spec/support/schema.rb
121
- - spec/support/string.rb
@@ -1,8 +0,0 @@
1
- class String
2
- def squish!
3
- gsub!(/\A[[:space:]]+/, '')
4
- gsub!(/[[:space:]]+\z/, '')
5
- gsub!(/[[:space:]]+/, ' ')
6
- self
7
- end
8
- end