Module: Joinable::ActsAsJoinable::InstanceMethods

Includes:
Joinable::ActsAsPermissable::InstanceMethods
Defined in:
lib/joinable/acts_as_joinable.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Joinable::ActsAsPermissable::InstanceMethods

#acts_like_permissable?, #who_can?

Instance Attribute Details

#cached_membershipObject

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_invitationObject

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_requestObject

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

#initiatorObject

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

Returns:

  • (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 check_permission(user, permission_name)
  permission_name = permission_name.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.default_permission_set.updated_at.to_f}_invitation_exists"
  else
    key = "default_permissions_#{self.default_permission_set.updated_at.to_f}"
  end

  cache_path = "permissions/#{self.class.table_name}/#{self.id}/user_#{user.id}_#{key}"

  if defined?(Rails.cache)
    permissions = Rails.cache.read(cache_path)
    if permissions && (value = permissions[permission_name]) != nil
      return value
    end
  end

  # The permission isn't cached yet, so cache it
  value = self.class.with_permission(user, permission_name).exists?(self.id)

  if defined?(Rails.cache)
    if permissions
      permissions = permissions.dup
      permissions[permission_name] = value
    else
      permissions = {permission_name => value}
    end
    Rails.cache.write(cache_path, permissions)
  end
  return value
end

#default_permission_setObject

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 default_permission_set
  super || self.build_default_permission_set
end

#default_permissionsObject

Convenience method for reading the default permission set’s access_model



253
254
255
# File 'lib/joinable/acts_as_joinable.rb', line 253

def default_permissions
  self.default_permission_set.permissions
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 default_permissions=(permissions)
  self.default_permission_set.permissions = permissions
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

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)


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_keyObject

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