Je continue à obtenir l'erreur suivante:définir dynamiquement named_scope basé sur current_user
You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.size
Sur la base de l'utilisateur actuel, lorsqu'ils naviguent sur une page, je veux les limiter à ce qu'ils peuvent voir en fonction de leur site . Le problème est qu'il n'y a pas d'association directe entre le site et la table utilisateur. Un contact a un seul utilisateur (les informations utilisateur sont stockées dans la variable current_user). Un site a beaucoup de contacts. Et un site a_many étudiants, où la table des étudiants a une clé étrangère de site_id. Il existe donc un lien entre les étudiants et le site, de sorte que lorsque l'utilisateur actuel accède à la page des étudiants, il ne peut voir que les étudiants du même site que lui. Je peux le faire en codant en dur un nombre dans un named_scope pour afficher seulement les étudiants pour le site de current_user. Mais les différents utilisateurs appartiendront à des sites différents et, une fois connecté, le site auquel ils sont associés changera. C'est le problème - pour définir dynamiquement cette valeur dans un named_scope. Voilà ce que j'ai:
StudentsController
def index_scoper
if current_user.role_id == 8
super.site_staff_limit while current_user[:site_id]
# The problem is the user table has no site_id. There is no direct
# link between the users table and sites table. However, there is
# a link between users and contacts and then site and contacts and
# then site and students, where students table has site_id.
else
super.with_state.with_site
end
end
Modèle étudiant
named_scope :site_staff_limit, lambda {|site_id| {:conditions => {:site_id => site_id}}}
Merci pour toutes suggestions.
relation entre les tables:
utilisateurs: contact_id Contact: clé primaire, contactable_id, contactable_type site: clé primaire étudiant: SITE_ID
modèle utilisateur belongs_to: Contact
Contactez modèle has_one: user appartient à: contactable,: polymorphique => true,: dependent =>: destroy
modèle du site has_many: contacts,: as =>: contactables has_many: étudiants
Les élèves font belongs_to: Site
Cela limite avec succès les étudiants par site: StudentsController def index_scoper si current_user .role_id == 8 super.site_staff_limit autre super.with_state.with_site fin fin
Les élèves font named_scope: site_staff_limit,: conditions => {: site_id => 1}
Le problème est différent les utilisateurs appartiennent à des sites différents, de sorte qu'ils ne peuvent les dossiers des étudiants d'accès du site auquel ils appartiennent. J'ai de la difficulté à faire en sorte que named_scope soit assez dynamique pour accomplir cela.
Avez-vous une chance de formater un peu mieux votre code? Merci. – Eli