2010-09-07 2 views
0

J'ai deux tables Utilisateurs (nom, email, mot de passe, instance_id, etc ...) exemple: james bond, [email protected] , 1 instance (id, domaine) exemple: 1, abc.comRails 3, CanCan pour limiter tous les résultats de requête dans l'application basée sur l'ID de l'utilisateur

Grâce à l'application que je veux vous assurer que James Bond ne voit que des données qui est attribué à son instance = 1

donc, si je avoir une table de livres avec (nom, desc, instance_id), il ne voit que les livres de son instance.

On me dit que CanCan est la solution, mais je ne vois pas comment faire quelque chose de globalement comme ci-dessus, il semble plus basé sur le rôle comme admin, modérateur, etc ... besoin mais à un niveau inférieur aux règles de données mentionnées ci-dessus.

Pensées?

Répondre

3

vous pouvez essayer d'utiliser des étendues comme:

class Books < ActiveRecord::Base 
# .... code .... 
scope :personal, proc {|user| where(:instance_id => user.instance_id) } 
# .... code ... 
end 

Maintenant vous pouvez faire:

@personal_books = Books.personal(@user) 

vous pouvez en savoir plus sur les étendues ici: http://www.railsdispatch.com/posts/rails-3-makes-life-better (faites défiler un peu)

Une autre façon est de faire une association comme

L'utilisateur has_many Boo ks à travers l'instance

Ensuite, vous auriez un utilisateur de mappage de table hérité supplémentaire aux livres sur leur instance. C'est une relation n: m. Un livre pourrait donc appartenir à plusieurs instances.

Il ressemblerait à ceci:

Tableau utilisateur:

utilisateurs (nom, email, mot de passe, instance_id, etc ...)

Rédigée Tableau:

Livres (nom , desc) # plus d'instance_id!

Mapping Tableau:

missions (instance_id, book_id)

Et vos modèles ressemblerait à ceci:

class Assignment < ActiveRecord::Base 
    belongs_to :book  # foreign key - book_id 
    belongs_to :instance # foreign key - instance_id 
end 

class Instance < ActiveRecord::Base 
    has_many :assignments 
    has_many :books, :through => :assignments 
end 

class Books < ActiveRecord::Base 
    has_many :assignments 
    has_many :users, :through => :assignments 
end 

class User < ActiveRecord::Base 
    belongs_to :instance 
end 

Le code pour obtenir tous les livres de l'instance d'un utilisateur ressemblerait à ceci:

@user  = User.find(:first) 
@books  = @user.instance.books.find(:all) 

(je vous recommande de lire http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)

Modifier

Vous pouvez essayer si un livre appartient toujours à une seule instance:

class User < ActiveRecord::Base 
    belongs_to :instance 
end 


class Instance < ActiveRecord::Base 
    has_many :users 
    has_many :books 
end 


class Books < ActiveRecord::Base 
    belongs_to :instance 
end 

Alors vous prenez les livres d'un utilisateur comme:

@user.instance.books.find(:all) 
+0

Merci, mais Je suis curieux de savoir pourquoi utiliser une table d'affectations, qui finirait par être une grande base de données si chaque table a besoin d'une table d'affectations pour correspondre à la table d'instance. Pourquoi ne pas simplement ajouter instance_id à tous les enregistrements de la base de données? – AnApprentice

+0

Parce que vous auriez beaucoup de doublons dans votre base de données. Un livre est un objet "unique" et peut appartenir à plusieurs instances, n'est-ce pas? Donc, vous devriez avoir une seule entrée pour le livre. Mais de nombreuses instances peuvent avoir accès à ce livre non? Vous devriez donc avoir une table supplémentaire indiquant quelles instances ont accès à certains livres. C'est ce qu'on appelle une relation many-to-many ou une relation n: m. – sled

+0

Traîneau, un livre n'appartient qu'à 1 instance, c'est pourquoi je ne sais pas si la table d'affectation est la bonne façon de procéder. – AnApprentice

Questions connexes