acts_as_readable 2.3.0 → 2.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28febc32aaf17802d8db7b624fc3dce68bf6620d438b8a2bab8c7aa2cc8620ca
4
- data.tar.gz: 6ad32b0cf210c6806c90611e6cc2575a5d710b87e65bd8d0d08ef35bde28627b
3
+ metadata.gz: 26f1b10303846fe0f6adb4dd943ca37ba592463bfaf57b6dbf8f55008bca9d9f
4
+ data.tar.gz: c108f52d20a6b6e32f76b57486a87dffcea367b33e2b9d11845761cbde28bb76
5
5
  SHA512:
6
- metadata.gz: 42f65a6d0f3071710fa9cbdb4b65c507f0a753dc299294989d5c908148512e3443514f4f500555be7fa01fcf3ccb618435a9a8a5197398668f3319d8d0b0daaf
7
- data.tar.gz: cbd81ccf4ea4d53f58ea46c67cf5d625daa83909476d84597eb4caf6c0ceae4f826579543240cee80bad5d231de4038072a3f59f5809d7c219117355418556a6
6
+ metadata.gz: 2cdf040047e4f4985c51d2bd1a0b3f207f4f8d6ee7c17f3732c5c93a09f89c2a842ec670e970ff5c8cb0f00dc0bf02fdbff9fe04b3d154b3881f4d52db17f209
7
+ data.tar.gz: 335b0e36faf70e2385bc806a5900a4eddaf66ab0e8fdf18b9c2850a041329408c89b0c8d6107eb29a596bcee7c3217522fc5a2907d625b202fec5ce61d19f0f7
data/README.rdoc CHANGED
@@ -32,6 +32,13 @@ TODO...
32
32
 
33
33
  bob.readings # => [<Reading 1>]
34
34
 
35
+ === Upgrading from 2.3.x to 2.4.0
36
+
37
+ Version 2.4.0 now supports reading and querying against STI subclasses, even when the read and queried subclass don't
38
+ match. This requires you to migrate the `readings.readable_type` column data to the base class name of the stored class
39
+ name, as in versions prior to 2.4.0 the column stored the class name of whatever instance was being read, event STI
40
+ subclasses.
41
+
35
42
  === Testing
36
43
 
37
44
  There are multiple gemfiles available for testing against different Rails versions. Set `BUNDLE_GEMFILE` to target them, e.g.
@@ -40,4 +47,4 @@ There are multiple gemfiles available for testing against different Rails versio
40
47
  BUNDLE_GEMFILE=gemfiles/rails7.gemfile bundle exec rspec
41
48
 
42
49
 
43
- Copyright (c) 2012 Culture Code Software Consulting. Released under the MIT license
50
+ Copyright (c) 2024 Culture Code Software Consulting. Released under the MIT license
@@ -6,8 +6,6 @@ module ActsAsReadable
6
6
  class_attribute :acts_as_readable_options
7
7
  self.acts_as_readable_options = options
8
8
 
9
- User.has_many :readings, :dependent => :delete_all
10
-
11
9
  has_many :readings, :as => :readable, :dependent => :delete_all
12
10
  has_many :readers, lambda { where :readings => {:state => 'read'} }, :through => :readings, :source => :user
13
11
 
@@ -46,7 +44,11 @@ module ActsAsReadable
46
44
  end
47
45
 
48
46
  def self.outer_join_readings(scope, user)
49
- scope.joins("LEFT OUTER JOIN readings ON readings.readable_type = '#{scope.model.name}' AND readings.readable_id = #{scope.model.table_name}.id AND readings.user_id = #{user.id}")
47
+ scope.joins("LEFT OUTER JOIN readings ON readings.readable_type = '#{readable_type(scope.model)}' AND readings.readable_id = #{scope.model.table_name}.id AND readings.user_id = #{user.id}")
48
+ end
49
+
50
+ def self.readable_type(readable_class)
51
+ readable_class.base_class.name
50
52
  end
51
53
  end
52
54
 
@@ -54,7 +56,7 @@ module ActsAsReadable
54
56
  # Find all the readings of the readables by the user in a single SQL query and cache them in the readables for use in the view.
55
57
  def cache_readings_for(readables, user)
56
58
  readings = []
57
- Reading.where(:readable_type => name, :readable_id => readables.collect(&:id), :user_id => user.id).each do |reading|
59
+ Reading.where(:readable_type => HelperMethods.readable_type(self), :readable_id => readables.collect(&:id), :user_id => user.id).each do |reading|
58
60
  readings[reading.readable_id] = reading
59
61
  end
60
62
 
@@ -69,7 +71,7 @@ module ActsAsReadable
69
71
  # If a :cache option has been set in acts_as_readable, a timestamp will be updated on the user instead of creating individual readings for each record
70
72
  def read_by!(user)
71
73
  if user.has_attribute?(acts_as_readable_options[:cache])
72
- Reading.where(:user_id => user.id, :readable_type => name).delete_all
74
+ Reading.where(:user_id => user.id, :readable_type => HelperMethods.readable_type(self)).delete_all
73
75
  user.update_column(acts_as_readable_options[:cache], Time.now)
74
76
  else
75
77
  unread_by(user).find_each do |record|
@@ -88,7 +90,7 @@ module ActsAsReadable
88
90
 
89
91
  def read_by!(user)
90
92
  # Find an existing reading and update the record so we can know when the thing was first read, and the last time we read it
91
- reading = Reading.find_or_initialize_by(:user_id => user.id, :readable_id => self.id, :readable_type => self.class.name)
93
+ reading = Reading.find_or_initialize_by(:user_id => user.id, :readable_id => self.id, :readable_type => HelperMethods.readable_type(self.class))
92
94
  reading.updated_at = Time.now # Explicitly set the read time to now in order to force a save in case we haven't changed anything else about the reading
93
95
  reading.state = :read
94
96
  reading.save!
@@ -98,7 +100,7 @@ module ActsAsReadable
98
100
  end
99
101
 
100
102
  def unread_by!(user)
101
- reading = Reading.find_or_initialize_by(:user_id => user.id, :readable_id => self.id, :readable_type => self.class.name)
103
+ reading = Reading.find_or_initialize_by(:user_id => user.id, :readable_id => self.id, :readable_type => HelperMethods.readable_type(self.class))
102
104
  reading.state = :unread
103
105
  reading.save!
104
106
  end
@@ -2,235 +2,250 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe 'acts_as_readable' do
5
- before(:each) do
6
- @comment = Comment.create
7
- @user = User.create
8
- end
9
-
10
- describe "the unread scope" do
11
- it "should not return records explicitly marked as read" do
12
- @comment.read_by! @user
13
- expect( Comment.unread_by(@user) ).not_to include(@comment)
14
- end
15
-
16
- it "should return records without readings if the user hasn't 'read all'" do
17
- expect( Comment.unread_by(@user) ).to include(@comment)
18
- end
19
-
20
- it "should return records explicitly marked as unread if the user hasn't 'read all'" do
21
- @comment.unread_by! @user
22
- expect( Comment.unread_by(@user) ).to include(@comment)
23
- end
24
-
25
- it "should return records explicitly marked as unread if the user has 'read all' before the record was marked unread" do
26
- Comment.read_by! @user
27
- @comment.unread_by! @user
28
- expect( Comment.unread_by(@user) ).to include(@comment)
29
- end
30
-
31
- it "should return records explicitly marked as unread after the user 'read all'" do
32
- @comment.read_by! @user
33
- Comment.read_by! @user
34
- @comment.unread_by! @user
35
- expect( Comment.unread_by(@user) ).to include(@comment)
36
- end
37
-
38
- it "should not return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
39
- @comment.unread_by! @user
40
- Comment.read_by! @user
41
- expect( Comment.unread_by(@user) ).not_to include(@comment)
42
- end
43
-
44
- it "should not return records that have been updated since they were last read" do
45
- @comment.read_by! @user
46
- @comment.touch
47
- expect( Comment.unread_by(@user) ).not_to include(@comment)
48
- end
49
-
50
- it "should return records that have been updated since they were last unread" do
51
- @comment.unread_by! @user
52
- @comment.touch
53
- expect( Comment.unread_by(@user) ).to include(@comment)
5
+ shared_examples_for 'a readable class' do |readable_class, queryable_class|
6
+ before(:each) do
7
+ @readable = readable_class.create
8
+ @queryable = @readable.becomes!(queryable_class)
9
+ @user = User.create
10
+ end
11
+
12
+ describe "the unread scope" do
13
+ it "should not return records explicitly marked as read" do
14
+ @readable.read_by! @user
15
+ expect(queryable_class.unread_by(@user)).not_to include(@queryable)
16
+ end
17
+
18
+ it "should return records without readings if the user hasn't 'read all'" do
19
+ expect(queryable_class.unread_by(@user)).to include(@queryable)
20
+ end
21
+
22
+ it "should return records explicitly marked as unread if the user hasn't 'read all'" do
23
+ @readable.unread_by! @user
24
+ expect(queryable_class.unread_by(@user)).to include(@queryable)
25
+ end
26
+
27
+ it "should return records explicitly marked as unread if the user has 'read all' before the record was marked unread" do
28
+ readable_class.read_by! @user
29
+ @readable.unread_by! @user
30
+ expect(queryable_class.unread_by(@user)).to include(@queryable)
31
+ end
32
+
33
+ it "should return records explicitly marked as unread after the user 'read all'" do
34
+ @readable.read_by! @user
35
+ readable_class.read_by! @user
36
+ @readable.unread_by! @user
37
+ expect(queryable_class.unread_by(@user)).to include(@queryable)
38
+ end
39
+
40
+ it "should not return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
41
+ @readable.unread_by! @user
42
+ readable_class.read_by! @user
43
+ expect(queryable_class.unread_by(@user)).not_to include(@queryable)
44
+ end
45
+
46
+ it "should not return records that have been updated since they were last read" do
47
+ @readable.read_by! @user
48
+ @readable.touch
49
+ expect(queryable_class.unread_by(@user)).not_to include(@queryable)
50
+ end
51
+
52
+ it "should return records that have been updated since they were last unread" do
53
+ @readable.unread_by! @user
54
+ @readable.touch
55
+ expect(queryable_class.unread_by(@user)).to include(@queryable)
56
+ end
57
+ end
58
+
59
+ describe "the read scope" do
60
+ it "should not return records without readings if the user has not 'read all'" do
61
+ expect(queryable_class.read_by(@user)).not_to include(@queryable)
62
+ end
63
+
64
+ it "should return records without readings if the user has 'read all' since the last time the record was updated" do
65
+ readable_class.read_by! @user
66
+ expect(queryable_class.read_by(@user)).to include(@queryable)
67
+ end
68
+
69
+ it "should return records explicitly marked as read if the user hasn't 'read all'" do
70
+ @readable.read_by! @user
71
+ expect(queryable_class.read_by(@user)).to include(@queryable)
72
+ end
73
+
74
+ it "should return records explicitly marked as read if the user has 'read all' before the record was marked read" do
75
+ readable_class.read_by! @user
76
+ @readable.read_by! @user
77
+ expect(queryable_class.read_by(@user)).to include(@queryable)
78
+ end
79
+
80
+ it "should not return records explicitly marked as unread after the user 'read all'" do
81
+ @readable.read_by! @user
82
+ readable_class.read_by! @user
83
+ @readable.unread_by! @user
84
+ expect(queryable_class.read_by(@user)).not_to include(@queryable)
85
+ end
86
+
87
+ it "should return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
88
+ @readable.unread_by! @user
89
+ readable_class.read_by! @user
90
+ expect(queryable_class.read_by(@user)).to include(@queryable)
91
+ end
92
+
93
+ it "should return records that have been updated since they were last read" do
94
+ @readable.read_by! @user
95
+ @readable.touch
96
+ expect(queryable_class.read_by(@user)).to include(@queryable)
97
+ end
98
+ end
99
+
100
+ describe "the latest_update_read_by scope" do
101
+ it "should return records without readings if the user has 'read all' since the last time the record was updated" do
102
+ readable_class.read_by! @user
103
+ expect(queryable_class.latest_update_read_by(@user)).to include(@queryable)
104
+ end
105
+
106
+ it "should return records explicitly marked as read if the user hasn't 'read all'" do
107
+ @readable.read_by! @user
108
+ expect(queryable_class.latest_update_read_by(@user)).to include(@queryable)
109
+ end
110
+
111
+ it "should return records explicitly marked as read if the user has 'read all' before the record was marked unread" do
112
+ readable_class.read_by! @user
113
+ @readable.read_by! @user
114
+ expect(queryable_class.latest_update_read_by(@user)).to include(@queryable)
115
+ end
116
+
117
+ it "should return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
118
+ @readable.unread_by! @user
119
+ readable_class.read_by! @user
120
+ expect(queryable_class.latest_update_read_by(@user)).to include(@queryable)
121
+ end
122
+
123
+ it "should not return records that have been updated since they were last read" do
124
+ @readable.read_by! @user
125
+ @readable.touch
126
+ expect(queryable_class.latest_update_read_by(@user)).not_to include(@queryable)
127
+ end
128
+
129
+ it "should return records updated after being read after a bulk read_by" do
130
+ @readable.read_by! @user
131
+ @readable.touch
132
+ readable_class.read_by! @user
133
+ expect(queryable_class.latest_update_read_by(@user)).to include(@queryable)
134
+ end
135
+ end
136
+
137
+ describe "the latest_update_unread_by scope" do
138
+ it "should not return records explicitly marked as read" do
139
+ @readable.read_by! @user
140
+ expect(queryable_class.latest_update_unread_by(@user)).not_to include(@queryable)
141
+ end
142
+
143
+ it "should return records without readings if the user hasn't 'read all'" do
144
+ expect(queryable_class.latest_update_unread_by(@user)).to include(@queryable)
145
+ end
146
+
147
+ it "should return records explicitly marked as unread if the user hasn't 'read all'" do
148
+ @readable.unread_by! @user
149
+ expect(queryable_class.latest_update_unread_by(@user)).to include(@queryable)
150
+ end
151
+
152
+ it "should return records explicitly marked as unread if the user has 'read all' before the record was marked unread" do
153
+ readable_class.read_by! @user
154
+ @readable.unread_by! @user
155
+ expect(queryable_class.latest_update_unread_by(@user)).to include(@queryable)
156
+ end
157
+
158
+ it "should not return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
159
+ @readable.unread_by! @user
160
+ readable_class.read_by! @user
161
+ expect(queryable_class.latest_update_unread_by(@user)).not_to include(@queryable)
162
+ end
163
+
164
+ it "should return records that have been updated since they were last read" do
165
+ @readable.read_by! @user
166
+ @readable.touch
167
+ expect(queryable_class.latest_update_unread_by(@user)).to include(@queryable)
168
+ end
169
+ end
170
+
171
+ describe "when checking a specific record for read_by?" do
172
+ it "should return true if the record hasn't explicitly been read, but the user has 'read all' since the record was created" do
173
+ readable_class.read_by! @user
174
+ expect(@queryable.read_by?(@user)).to be_truthy
175
+ end
176
+
177
+ it "should return true if the record hasn't explicitly been read and the user has 'read all' since the record was created but not since it was updated" do
178
+ readable_class.read_by! @user
179
+ @readable.touch
180
+ expect(@queryable.read_by?(@user)).to be_truthy
181
+ end
182
+
183
+ it "should return true if the record has been explicitly marked as read and the user hasn't 'read all'" do
184
+ @readable.read_by! @user
185
+ expect(@queryable.read_by?(@user)).to be_truthy
186
+ end
187
+
188
+ it "should return false if the user 'read all' before and then marked the record as unread" do
189
+ readable_class.read_by! @user
190
+ @readable.unread_by! @user
191
+ expect(@queryable.read_by?(@user)).to be_falsey
192
+ end
193
+
194
+ it "should return true if the user has explicitly marked it as unread and then 'reads all'" do
195
+ @readable.unread_by! @user
196
+ readable_class.read_by! @user
197
+ expect(@queryable.read_by?(@user)).to be_truthy
198
+ end
199
+ end
200
+
201
+ describe "when checking a specific record for latest_update_read_by?" do
202
+ it "should return true if the record hasn't explicitly been read, but the user has 'read all' since the record was updated" do
203
+ readable_class.read_by! @user
204
+ expect(@queryable.latest_update_read_by?(@user)).to be_truthy
205
+ end
206
+
207
+ it "should return false if the record hasn't explicitly been read and the user has 'read all' since the record was created but not since it was updated" do
208
+ readable_class.read_by! @user
209
+ @readable.touch
210
+ expect(@queryable.latest_update_read_by?(@user)).to be_falsey
211
+ end
212
+
213
+ it "should return true if the record has been explicitly marked as read and the user hasn't 'read all'" do
214
+ @readable.read_by! @user
215
+ expect(@queryable.latest_update_read_by?(@user)).to be_truthy
216
+ end
217
+
218
+ it "should return false if the user 'read all' before and then marked the record as unread" do
219
+ readable_class.read_by! @user
220
+ @readable.unread_by! @user
221
+ expect(@queryable.latest_update_read_by?(@user)).to be_falsey
222
+ end
223
+
224
+ it "should return true if the user has explicitly marked it as unread and then 'reads all'" do
225
+ @readable.unread_by! @user
226
+ readable_class.read_by! @user
227
+ expect(@queryable.latest_update_read_by?(@user)).to be_truthy
228
+ end
229
+
230
+ it "should return false if the user 'read all' before and then marked the record as unread using cached readings" do
231
+ readable_class.read_by! @user
232
+ @readable.unread_by! @user
233
+ readable_class.cache_readings_for([@readable], @user)
234
+ expect(@queryable.latest_update_read_by?(@user)).to be_falsey
235
+ end
54
236
  end
55
237
  end
56
238
 
57
- describe "the read scope" do
58
- it "should not return records without readings if the user has not 'read all'" do
59
- expect( Comment.read_by(@user) ).not_to include(@comment)
60
- end
61
-
62
- it "should return records without readings if the user has 'read all' since the last time the record was updated" do
63
- Comment.read_by! @user
64
- expect( Comment.read_by(@user) ).to include(@comment)
65
- end
66
-
67
- it "should return records explicitly marked as read if the user hasn't 'read all'" do
68
- @comment.read_by! @user
69
- expect( Comment.read_by(@user) ).to include(@comment)
70
- end
71
-
72
- it "should return records explicitly marked as read if the user has 'read all' before the record was marked read" do
73
- Comment.read_by! @user
74
- @comment.read_by! @user
75
- expect( Comment.read_by(@user) ).to include(@comment)
76
- end
77
-
78
- it "should not return records explicitly marked as unread after the user 'read all'" do
79
- @comment.read_by! @user
80
- Comment.read_by! @user
81
- @comment.unread_by! @user
82
- expect( Comment.read_by(@user) ).not_to include(@comment)
83
- end
84
-
85
- it "should return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
86
- @comment.unread_by! @user
87
- Comment.read_by! @user
88
- expect( Comment.read_by(@user) ).to include(@comment)
89
- end
90
-
91
- it "should return records that have been updated since they were last read" do
92
- @comment.read_by! @user
93
- @comment.touch
94
- expect( Comment.read_by(@user) ).to include(@comment)
95
- end
239
+ context 'the readable is a base class' do
240
+ it_behaves_like 'a readable class', Comment, Comment
96
241
  end
97
242
 
98
- describe "the latest_update_read_by scope" do
99
- it "should return records without readings if the user has 'read all' since the last time the record was updated" do
100
- Comment.read_by! @user
101
- expect( Comment.latest_update_read_by(@user) ).to include(@comment)
102
- end
103
-
104
- it "should return records explicitly marked as read if the user hasn't 'read all'" do
105
- @comment.read_by! @user
106
- expect( Comment.latest_update_read_by(@user) ).to include(@comment)
107
- end
108
-
109
- it "should return records explicitly marked as read if the user has 'read all' before the record was marked unread" do
110
- Comment.read_by! @user
111
- @comment.read_by! @user
112
- expect( Comment.latest_update_read_by(@user) ).to include(@comment)
113
- end
114
-
115
- it "should return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
116
- @comment.unread_by! @user
117
- Comment.read_by! @user
118
- expect( Comment.latest_update_read_by(@user) ).to include(@comment)
119
- end
120
-
121
- it "should not return records that have been updated since they were last read" do
122
- @comment.read_by! @user
123
- @comment.touch
124
- expect( Comment.latest_update_read_by(@user) ).not_to include(@comment)
125
- end
126
-
127
- it "should return records updated after being read after a bulk read_by" do
128
- @comment.read_by! @user
129
- @comment.touch
130
- Comment.read_by! @user
131
- expect( Comment.latest_update_read_by(@user) ).to include(@comment)
132
- end
243
+ context 'when reading an STI record' do
244
+ it_behaves_like 'a readable class', PrivateComment, PrivateComment
133
245
  end
134
246
 
135
- describe "the latest_update_unread_by scope" do
136
- it "should not return records explicitly marked as read" do
137
- @comment.read_by! @user
138
- expect( Comment.latest_update_unread_by(@user) ).not_to include(@comment)
139
- end
140
-
141
- it "should return records without readings if the user hasn't 'read all'" do
142
- expect( Comment.latest_update_unread_by(@user) ).to include(@comment)
143
- end
144
-
145
- it "should return records explicitly marked as unread if the user hasn't 'read all'" do
146
- @comment.unread_by! @user
147
- expect( Comment.latest_update_unread_by(@user) ).to include(@comment)
148
- end
149
-
150
- it "should return records explicitly marked as unread if the user has 'read all' before the record was marked unread" do
151
- Comment.read_by! @user
152
- @comment.unread_by! @user
153
- expect( Comment.latest_update_unread_by(@user) ).to include(@comment)
154
- end
155
-
156
- it "should not return records explicitly marked as unread if the user has 'read all' after the record was marked unread" do
157
- @comment.unread_by! @user
158
- Comment.read_by! @user
159
- expect( Comment.latest_update_unread_by(@user) ).not_to include(@comment)
160
- end
161
-
162
- it "should return records that have been updated since they were last read" do
163
- @comment.read_by! @user
164
- @comment.touch
165
- expect( Comment.latest_update_unread_by(@user) ).to include(@comment)
166
- end
167
- end
168
-
169
- describe "when checking a specific record for read_by?" do
170
- it "should return true if the record hasn't explicitly been read, but the user has 'read all' since the record was created" do
171
- Comment.read_by! @user
172
- expect( @comment.read_by?(@user) ).to be_truthy
173
- end
174
-
175
- it "should return true if the record hasn't explicitly been read and the user has 'read all' since the record was created but not since it was updated" do
176
- Comment.read_by! @user
177
- @comment.touch
178
- expect( @comment.read_by?(@user) ).to be_truthy
179
- end
180
-
181
- it "should return true if the record has been explicitly marked as read and the user hasn't 'read all'" do
182
- @comment.read_by! @user
183
- expect( @comment.read_by?(@user) ).to be_truthy
184
- end
185
-
186
- it "should return false if the user 'read all' before and then marked the record as unread" do
187
- Comment.read_by! @user
188
- @comment.unread_by! @user
189
- expect( @comment.read_by?(@user) ).to be_falsey
190
- end
191
-
192
- it "should return true if the user has explicitly marked it as unread and then 'reads all'" do
193
- @comment.unread_by! @user
194
- Comment.read_by! @user
195
- expect( @comment.read_by?(@user) ).to be_truthy
196
- end
197
- end
198
-
199
- describe "when checking a specific record for latest_update_read_by?" do
200
- it "should return true if the record hasn't explicitly been read, but the user has 'read all' since the record was updated" do
201
- Comment.read_by! @user
202
- expect( @comment.latest_update_read_by?(@user) ).to be_truthy
203
- end
204
-
205
- it "should return false if the record hasn't explicitly been read and the user has 'read all' since the record was created but not since it was updated" do
206
- Comment.read_by! @user
207
- @comment.touch
208
- expect( @comment.latest_update_read_by?(@user) ).to be_falsey
209
- end
210
-
211
- it "should return true if the record has been explicitly marked as read and the user hasn't 'read all'" do
212
- @comment.read_by! @user
213
- expect( @comment.latest_update_read_by?(@user) ).to be_truthy
214
- end
215
-
216
- it "should return false if the user 'read all' before and then marked the record as unread" do
217
- Comment.read_by! @user
218
- @comment.unread_by! @user
219
- expect( @comment.latest_update_read_by?(@user) ).to be_falsey
220
- end
221
-
222
- it "should return true if the user has explicitly marked it as unread and then 'reads all'" do
223
- @comment.unread_by! @user
224
- Comment.read_by! @user
225
- expect( @comment.latest_update_read_by?(@user) ).to be_truthy
226
- end
227
-
228
- it "should return false if the user 'read all' before and then marked the record as unread using cached readings" do
229
- Comment.read_by! @user
230
- @comment.unread_by! @user
231
- Comment.cache_readings_for([@comment], @user)
232
- expect( @comment.latest_update_read_by?(@user) ).to be_falsey
233
- end
247
+ context 'when reading an STI record and querying against the base class record' do
248
+ it_behaves_like 'a readable class', PrivateComment, Comment
234
249
  end
235
250
  end
236
251
  `dropdb acts_as_readable_test`
data/spec/spec_helper.rb CHANGED
@@ -17,6 +17,7 @@ ActiveRecord::Schema.define(:version => 0) do
17
17
  end
18
18
 
19
19
  create_table :comments, :force => true do |t|
20
+ t.string :type
20
21
  t.timestamps
21
22
  end
22
23
 
@@ -35,6 +36,9 @@ class Comment < ActiveRecord::Base
35
36
  acts_as_readable :cache => :comments_read_at
36
37
  end
37
38
 
39
+ class PrivateComment < Comment
40
+ end
41
+
38
42
 
39
43
  def debug_queries
40
44
  logger = ActiveRecord::Base.logger
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_readable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Jakobsen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-02-22 00:00:00.000000000 Z
12
+ date: 2024-03-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails