Selección de Rails 3 con incluir

Tengo problemas reales para resolverlos. Tengo dos modelos de usuario diferentes (voluntarios y personas mayores) y quiero vincularlos. He establecido una relación habtm y puedo cargar, por ejemplo, un voluntario con un senior/seniors adjunto. Pero me gustaría filtrar qué atributos se cargan. ¿Cómo puedes hacer esto? (Quiero hacer esto por seguridad, pero ni siquiera estoy seguro de que sea un problema).

Sé que include with select no funciona y he estado intentando con uniones pero no puedo hacer que funcione.

Así cargué a los voluntarios con todos los atributos senior

class VolunteersController < ApplicationController

    def index
        @volunteer = Volunteer.select(Volunteer::PROFILE_COLUMNS).find(current_volunteer)
    end

end

modelos:

class Volunteer < ActiveRecord::Base
    has_and_belongs_to_many :seniors
    ...
end

class Seniors < ActiveRecord::Base
    has_and_belongs_to_many :volunteers
    ...
end

preguntado el 12 de junio de 12 a las 09:06

Por lo general, usted controla lo que se muestra, no lo que se obtiene de la base de datos. -

Ok, pero ¿debería eliminar los campos de contraseñas (encriptadas) y otra información confidencial de @volunteer o es seguro tenerlo en @volunteer? (Estoy caminando sobre "@volunteer.seniors.first.password", por ejemplo) -

El punto es que la información confidencial no debe estar a la vista. No me importa dónde se desnude, en el modelo o en la vista. La vista está a solo un par de llamadas de método de distancia. Solo me aseguro de que no sea así. Quiero decir que nadie excepto tú puede acceder a @volunteer, ¿verdad? Por otro lado, nunca tuve ningún secreto nuclear aquí :) -

Es bueno entender el escenario del que intentas protegerte. Lo que puedo imaginar es que un desarrollador escribe por error '@volunteer.encrypted_password' en lugar de '@volunteer.name'. Si ese es el caso, es mejor que te protejas de ese desarrollador :) Si puedes pensar en un escenario más probable, podría cambiar mi actitud. -

Ok, entonces supongo que debería estar bien como está. Gracias por aclarar eso. -

1 Respuestas

Tu podrías intentar:

@volunteer = Volunteer.find(current_volunteer, 
:select => Volunteer::PROFILE_COLUMNS, 
:joins => "left outer join seniors on seniors.id = volunteers.senior_id")

Aunque no probado. Mejor explicación en http://www.fortytwo.gr/blog/18/9-Essential-Rails-Tips

Respondido el 12 de junio de 12 a las 09:06

Gracias por la respuesta, en realidad miro ese artículo pero no puedo hacerlo funcionar. Un problema es que mi conexión se realiza mediante una tabla seniors_volunteers y, por supuesto, especifique las columnas como seniors.first_name y voluntario.first_name. Pero al final obtuve todos los atributos de todos modos. Tal vez hice algo mal en el sql: "LEFT OUTER JOIN seniors_volunteers ON seniors_volunteers.volunteer_id = Volunteers.id LEFT OUTER JOIN seniors ON seniors.id = seniors_volunteers.senior_id" - Olle

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.