Problema con scope

4 views
Skip to first unread message

Jose De Sousa

unread,
Nov 8, 2016, 4:58:54 PM11/8/16
to rubysur
Hola muchachos, tengo un problema con scope a ver quién me puedar dar luces

Tengo los tres modelos siguientes (de una relación n a n):

class Participante < ApplicationRecord

end

class ParticipanteCohorte < ApplicationRecord

    belongs_to :participante
    has_many :plan_empresas, dependent: :destroy
end

class PlanEmpresa < ApplicationRecord
   belongs_to :participante_cohorte
   scope :participante_seleccionado_
plan_empresa, ->(id) {PlanEmpresa.where(:participante_cohorte_id => id).first}
end

EN el controlador hago lo siguiente:
   
  @plan_empresa = PlanEmpresa.participante_seleccionado_plan_empresa(6)
 
Y resulta ser que @plan_empresa tiene un registro pero realmente en la BD no lo tiene, de echo si hago en el mismo controlador

@plan_empresa.where(:participante_cohorte_id => 6) 
No devuleve nada como debe ser

Por que puede suceder esto?

Gracias de antemano por la ayuda

José

Cesar Martinez

unread,
Nov 8, 2016, 7:48:56 PM11/8/16
to Grupo RubySur
scope :participante_seleccionado_plan_empresa, ->(id) { where( "participante_cohorte_id = ?", id).first }
Esta demás que vuelvas a hacer referencia a tu modelo plan empresas en tu escope, ya que al existir el scope dentro de clase PlanEmpresa 

@plan_empresa = PlanEmpresa.participante_seleccionado_plan_empresa(6)


--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Jose De Sousa

unread,
Nov 8, 2016, 8:11:34 PM11/8/16
to rubysur
Hola Cesar gracias por responder,

Si es cierto, pero aplique lo que me dices y sigue diciendome que @plan_empresa tiene un registro, cuando realmente no lo tiene.

Si hago directamente en el controller: @plan_empresa.where(:participante_cohorte_id => 6)
@plan_empresa si está vacio

No lo entiendo


Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
OtusNet ©
Soluciones inteligentes
@ sus necesidades en Internet
Joselito De Sousa
(058)-0412.222.98.25

Cesar Martinez

unread,
Nov 8, 2016, 8:42:37 PM11/8/16
to Grupo RubySur
@plan_empresa.where(:participante_cohorte_id => 6) !error

@plan_empresa es una variable de clase empleada para recibir el resultado de una consulta, una colección de objetos 

PlanEmpresa.where(:participante_cohorte_id => 6), los métodos de active record solo los puedes emplear en los modelos que hacen referencias a las tablas esa es la finalidad del ORM de rails

Jose De Sousa

unread,
Nov 8, 2016, 8:50:37 PM11/8/16
to rubysur
Ups, disculpa Cesar, escribi mal

En el controller:
PlanEmpresa.where(participante_cohorte_id: 6) Esto funciona, no tiene registros.

pero el scope en el modelo:
scope :participante_seleccionado_plan_empresa, ->(id) {where(:participante_cohorte_id => id).first}

con la llamada del controller:

@plan_empresa = PlanEmpresa.participante_seleccionado_plan_empresa(id_cohorte_participante)

No funciona dice que hay un registro

Eso es lo que no entiendo Cesar



Cristian

unread,
Nov 8, 2016, 9:02:42 PM11/8/16
to rubysur

El 8 nov. 2016 22:50, "Jose De Sousa" <jos...@gmail.com> escribió:
>
> Ups, disculpa Cesar, escribi mal
>
> En el controller:
> PlanEmpresa.where(participante_cohorte_id: 6) Esto funciona, no tiene registros.
>
> pero el scope en el modelo:
> scope :participante_seleccionado_plan_empresa, ->(id) {where(:participante_cohorte_id => id).first}

Los scopes deben devolver un ActiveRecord:Relation no una instancia de un modelo en particular, los scopes se pueden encadenar, contar, agrupar, limitar, etc. Si aplicas  .first dentro del scope todo esto ya no es posible. Te diría que primero cambies esto, como primer paso, quizás pasarlo a un método te sea suficiente, o simplemente aplica el first cuando lo llamas.

No estoy seguro de que este sea el único error, pero que pasa si cambias eso y ejecutas estas mismas pruebas?

>
> con la llamada del controller:
>
> @plan_empresa = PlanEmpresa.participante_seleccionado_plan_empresa(id_cohorte_participante)

Como obtenes el valor de id_cohorte_participante?

Que pasa si pones 6 hardcodeado como la prueba anterior?

>>>>> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.


>>>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>>
>>>>
>>>> --
>>>> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

>>>> Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.


>>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>
>>>
>>>
>>>
>>> --
>>> OtusNet ©
>>> Soluciones inteligentes
>>> @ sus necesidades en Internet
>>> Joselito De Sousa
>>> (058)-0412.222.98.25
>>>
>>> --
>>> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

>>> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.


>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>
>>
>> --
>> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

>> Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.


>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>
>
>
>
> --
> OtusNet ©
> Soluciones inteligentes
> @ sus necesidades en Internet
> Joselito De Sousa
> (058)-0412.222.98.25
>
> --
> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

> Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.

Jose De Sousa

unread,
Nov 8, 2016, 9:10:36 PM11/8/16
to rubysur
Cristian,  lo coloque y sigue dando el mismo resultado.

    scope :participante_seleccionado_plan_empresa, ->(id) {where(:participante_cohorte_id => 6).first}

Un registro que no existe.

😨

>>>>> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.


>>>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>>
>>>>
>>>> --
>>>> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

>>>> Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.


>>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>
>>>
>>>
>>>
>>> --
>>> OtusNet ©
>>> Soluciones inteligentes
>>> @ sus necesidades en Internet
>>> Joselito De Sousa
>>> (058)-0412.222.98.25
>>>
>>> --
>>> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

>>> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.


>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>
>>
>> --
>> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

>> Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.


>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>
>
>
>
> --
> OtusNet ©
> Soluciones inteligentes
> @ sus necesidades en Internet
> Joselito De Sousa
> (058)-0412.222.98.25
>
> --
> Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.

> Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.


> Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

Cristian

unread,
Nov 8, 2016, 9:13:15 PM11/8/16
to rubysur

No es correcto tener el .first dentro del scope, deberías sacarlo, no se que problemas te puede traer, también te podrías fijar en el log cual es el query que finalmente ejecuta, eso te puede ayudar a ver el problema.

Jose De Sousa

unread,
Nov 8, 2016, 9:18:59 PM11/8/16
to rubysur
Wuao, eso exactamente era el problema,

Full agradecido

👍
Reply all
Reply to author
Forward
0 new messages