Module: Joinable::ActsAsJoinable::InstanceMethods
- Defined in:
- lib/joinable/acts_as_joinable.rb
Instance Attribute Summary collapse
-
#cached_membership ⇒ Object
Returns the value of attribute cached_membership.
-
#cached_membership_invitation ⇒ Object
Returns the value of attribute cached_membership_invitation.
-
#cached_membership_request ⇒ Object
Returns the value of attribute cached_membership_request.
-
#initiator ⇒ Object
Returns the value of attribute initiator.
Instance Method Summary collapse
- #acts_like_joinable? ⇒ Boolean
-
#attributes=(attributes_hash) ⇒ Object
Override attributes= to make sure that the user and initiator attributes are initialized before the membership_invitation and membership before_add callbacks are triggered since they reference these attributes.
-
#check_permission(user, permission_name) ⇒ Object
Returns true or false depending on whether or not the user has the specified permission for this object.
-
#default_permission_set ⇒ Object
Ensure the joinable has a set of default permissions (an empty set unless one already exists).
-
#default_permissions ⇒ Object
Convenience method for reading the default permission set’s access_model.
-
#default_permissions=(permissions) ⇒ Object
Convenience method for writing the default permission set’s access_model.
-
#membership_for(user_id) ⇒ Object
Get the membership (if any) for a specific user.
-
#membership_for?(user_id) ⇒ Boolean
Find out whether this Joinable has a membership for a certain user and return true, else false.
-
#membership_invitation_for(user) ⇒ Object
Get the membership invitation (if any) for a specific user.
-
#membership_invitation_for?(user) ⇒ Boolean
Find out whether this Joinable has a membership invitation for a certain user and return true, else false.
-
#membership_request_for(user) ⇒ Object
Get the membership request (if any) for a specific user.
-
#membership_request_for?(user) ⇒ Boolean
Find out whether this Joinable has a membership request for a certain user and return true, else false.
-
#memberships_cache_key ⇒ Object
Returns a unique cache key any time the memberships were updated for this joinable.
Methods included from Joinable::ActsAsPermissable::InstanceMethods
#acts_like_permissable?, #who_can?
Instance Attribute Details
#cached_membership ⇒ Object
Returns the value of attribute cached_membership.
178 179 180 |
# File 'lib/joinable/acts_as_joinable.rb', line 178 def cached_membership @cached_membership end |
#cached_membership_invitation ⇒ Object
Returns the value of attribute cached_membership_invitation.
178 179 180 |
# File 'lib/joinable/acts_as_joinable.rb', line 178 def cached_membership_invitation @cached_membership_invitation end |
#cached_membership_request ⇒ Object
Returns the value of attribute cached_membership_request.
178 179 180 |
# File 'lib/joinable/acts_as_joinable.rb', line 178 def cached_membership_request @cached_membership_request end |
#initiator ⇒ Object
Returns the value of attribute initiator.
178 179 180 |
# File 'lib/joinable/acts_as_joinable.rb', line 178 def initiator @initiator end |
Instance Method Details
#acts_like_joinable? ⇒ Boolean
174 175 176 |
# File 'lib/joinable/acts_as_joinable.rb', line 174 def acts_like_joinable? true end |
#attributes=(attributes_hash) ⇒ Object
Override attributes= to make sure that the user and initiator attributes are initialized before the membership_invitation and membership before_add callbacks are triggered since they reference these attributes
170 171 172 |
# File 'lib/joinable/acts_as_joinable.rb', line 170 def attributes=(attributes_hash) super(ActiveSupport::OrderedHash[attributes_hash.symbolize_keys.sort_by {|a| [:user, :user_id, :initiator].include?(a.first) ? 0 : 1}]) end |
#check_permission(user, permission_name) ⇒ Object
Returns true or false depending on whether or not the user has the specified permission for this object. Will cache the result if uncached.
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
# File 'lib/joinable/acts_as_joinable.rb', line 264 def (user, ) = .to_s.dup # Generate a cache path based on the factors that affect the user's permissions # If User has membership # - depends on permissions # Elsif User has been invited # - depends on existence of invitation and the default permissions (when checking the view permission) # Else User doesn't have any membership # - depends on default permissions of the joinable if membership = memberships.where(:user_id => user.id).first key = "membership_#{membership.updated_at.to_f}" elsif self.membership_invitations.where(:user_id => user.id).exists? key = "default_permissions_#{self..updated_at.to_f}_invitation_exists" else key = "default_permissions_#{self..updated_at.to_f}" end cache_path = "permissions/#{self.class.table_name}/#{self.id}/user_#{user.id}_#{key}" if defined?(Rails.cache) = Rails.cache.read(cache_path) if && (value = []) != nil return value end end # The permission isn't cached yet, so cache it value = self.class.(user, ).exists?(self.id) if defined?(Rails.cache) if = .dup [] = value else = { => value} end Rails.cache.write(cache_path, ) end return value end |
#default_permission_set ⇒ Object
Ensure the joinable has a set of default permissions (an empty set unless one already exists)
307 308 309 |
# File 'lib/joinable/acts_as_joinable.rb', line 307 def super || self. end |
#default_permissions ⇒ Object
Convenience method for reading the default permission set’s access_model
253 254 255 |
# File 'lib/joinable/acts_as_joinable.rb', line 253 def self.. end |
#default_permissions=(permissions) ⇒ Object
Convenience method for writing the default permission set’s access_model
258 259 260 |
# File 'lib/joinable/acts_as_joinable.rb', line 258 def () self.. = end |
#membership_for(user_id) ⇒ Object
Get the membership (if any) for a specific user. This method also supports caching of a membership request in order to facilitate eager loading. NOTE: See :membership_request_for documentation for an in depth example of this type of behaviour
231 232 233 234 235 236 237 |
# File 'lib/joinable/acts_as_joinable.rb', line 231 def membership_for(user_id) if cached_membership != nil cached_membership else memberships.where(:user_id => user_id).first end end |
#membership_for?(user_id) ⇒ Boolean
Find out whether this Joinable has a membership for a certain user and return true, else false
240 241 242 |
# File 'lib/joinable/acts_as_joinable.rb', line 240 def membership_for?(user_id) !membership_for(user_id).nil? end |
#membership_invitation_for(user) ⇒ Object
Get the membership invitation (if any) for a specific user. This method also supports caching of a membership request in order to facilitate eager loading. NOTE: See :membership_request_for documentation for an in depth example of this type of behaviour
214 215 216 217 218 219 220 |
# File 'lib/joinable/acts_as_joinable.rb', line 214 def membership_invitation_for(user) if cached_membership_invitation != nil cached_membership_invitation else membership_invitations.where(:user_id => user.id).first end end |
#membership_invitation_for?(user) ⇒ Boolean
Find out whether this Joinable has a membership invitation for a certain user and return true, else false
223 224 225 |
# File 'lib/joinable/acts_as_joinable.rb', line 223 def membership_invitation_for?(user) !membership_invitation_for(user).nil? end |
#membership_request_for(user) ⇒ Object
Get the membership request (if any) for a specific user. This method also supports caching of a membership request in order to facilitate eager loading.
eg. For all of the projects on the projects index page, we want to do something similar to Project.all(:include => :membership_requests).
We can’t do exactly that however because we only want the membership_requests related to the current_user, not all users.
Instead, we fake it by doing a separate query which gets all the user’s membership_requests related to all the projects being displayed. We then cache the request relevant to this project in the cached_membership_request instance variable for later use by the view.
196 197 198 199 200 201 202 |
# File 'lib/joinable/acts_as_joinable.rb', line 196 def membership_request_for(user) if cached_membership_request != nil cached_membership_request else membership_requests.where(:user_id => user.id).first end end |
#membership_request_for?(user) ⇒ Boolean
Find out whether this Joinable has a membership request for a certain user and return true, else false
205 206 207 |
# File 'lib/joinable/acts_as_joinable.rb', line 205 def membership_request_for?(user) !membership_request_for(user).nil? end |
#memberships_cache_key ⇒ Object
Returns a unique cache key any time the memberships were updated for this joinable
245 246 247 |
# File 'lib/joinable/acts_as_joinable.rb', line 245 def memberships_cache_key "#{memberships.size}_#{memberships.maximum(:updated_at).to_f}" end |