Domanda

Sto cercando di definire un nome_scope per tutti i miei modelli in un'applicazione Rails.

Al momento, sono stato in grado di avvicinarmi a questo scrivendo un inizializzatore per ActiveRecord :: Base e inserendo metodi regolari. Naturalmente, questo non offre alcun vantaggio reale quando si tratta di creare catene di query ed è probabilmente il modo meno razionale per portare a termine il lavoro.

Tuttavia, non funziona quando inizio a provare a utilizzare i metodi has_many, named_scope, ecc ... ActiveRecord.

Anche se capisco che il mio named_scope probabilmente non è corretto, voglio davvero solo aiutare a definire il named_scope. Inoltre, al momento non sono interessato ad alcun GEM Ruby ACL.

In inizializzatori /:

class ActiveRecord::Base

  has_many(:permissions)
  named_scope(:acl_check, lambda do |user_id, method|
        {
            :include => :permission,
            :conditions => [
                ["permissions.user_id=?", user_id],
                ["permissions.method=?", method],
                ["permissions.classname=?", self.class.name]
            ]
        }
  end)

    # Conducts a permission check for the current instance.
    def check_acl?(user_id, method)

        # Perform the permission check by User.
        permission_check = Permission.find_by_user_id_and_instance_id_and_classname_and_method(user_id, self.id, self.class.name, method)
        if(permission_check)
            # If the row exists, we generate a hit.
            return(true)
        end

        # Perform the permission check by Role.

        # Otherwise, the permissions check was a miss.
        return(false)

    end

end
È stato utile?

Soluzione

il has_many probabilmente non funzionerà perché viene valutato nel corpo della classe e le chiavi esterne attese sono per la classe in cui è stata valutata piuttosto che per le classi ereditarie. (ad es. il modello Blog con id = 42 può avere molti modelli Commento memorizzati con blog_id = 42, le chiavi necessarie per farlo funzionare si basano sul nome della classe)

L'ambito denominato dovrebbe funzionare se è corretto.

Il metodo ereditato dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top