Session[:user_id] = usuario.nodo.find(5)

Tengo un usuario, que tiene varios nodos, que tiene varios subnodos

utilizo claves ajenas en la BD y has_many en los modelos.

ahora llego el momento de los permisos de forma que el usuario1,no pueda
acceder a
los nodos y subnodos del usuario2

==================================

Pues nada, el usuario se logea y cuando se pulse el botón de validar, se
ejecutará el método ‘login’ del controlador, que es donde comprobaremos
si el usuario puede seguir o no y si es valido se le asigna una variable
session:

creo la sesión con el Id del usuario

session[:user_id] = logged_in_user

y utilizo ApplicationController

para definir el metodo authorize

def authorize
unless session[:user_id]
flash[:notice] = “Please log in”
session[:jumpto] = request.parameters
redirect_to(:controller => “login”, :action => ‘login’)
end
end

y utilizo before_filter :authorize en los controladores q tiene q ser
privados.

===================================00
OK tengo la mitad de la pelicula, pero ahora es donde me atasco, en la
parte mas facil.

de alguna forma tengo q modificar el metodo authorize que

si el valor de session[:user_id] coincide con el valor del usuario de
algun nodo o subnodo, se permita la accion y si no (pq se acede
directamente por url /subnodo/21) se remita al login

CONCRETANDO:

1.- como defino los modelos para poder realizar la comparacion
session[:user_id] = usuario.nodo.subnodo.find(21)
o
session[:user_id] = usuario.nodo.find(5)

2.- y si lo complico mas y un nodo puede pertenecer a varios usuarios,
(relacion muchos a muchos)

y finalmente 3, aunque esto creo q ya sabre hacerlo solito,
como modifico el metodo autorize para que me realice la accion.

Échale un vistazo a acts_as_tree

http://api.rubyonrails.com/classes/ActiveRecord/Acts/Tree/ClassMethods.html#M000566