En Rails, ¿cómo puedo devolver un registro asociado usando incluye?

Soy consciente de los métodos incluidos y extract_asociados.

extract_associado como usado aquí, en el Rails docs, sólo devuelve los registros de usuario -

account.memberships.extract_associated(:user)
# => Returns collection of User records 

Estoy buscando devolver los registros de membresía, con los registros de usuario en la misma matriz. Sé que el includes método debe hacer esto por mí, pero mi respuesta sólo incluye el usuario_id y no el registro real, es decir, el uso de incluye no ha cambiado lo que se ha devuelto en absoluto, como así:-

account.memberships.includes(:user)
# => Returns collection of Membership records, with user_ids 
[{ "id": 3, "account_id": 1, "user_id": 2, "membership_name": 'Annual Membership'}]

Mis afiliaciones pertenecen a un Usuario, y un Usuario tiene_muchos Miembros.

¿Qué estoy perdiendo aquí?

No es una opción para mí hacer membership.user en mi opinión, porque estoy usando VueJS así que necesito pasar todos los datos que necesito.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por bytebison


3 Respuestas:

  • puede incluir la colección de asociación como json.

    account.memberships.includes(:user)
           .as_json(include: { memberships: { include: :user } })
    

    Vea los detalles para API de la documentación. https://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

    Respondida el Dec 17, 2020 a las 22:55 - por syntaxsensei8acf

    Votos positivos: 0 | Votos negativos: 0

  • Parece que estás en el camino correcto al usar el método includes en Rails para devolver los registros asociados. Sin embargo, el problema que estás experimentando es que estás obteniendo únicamente el user_id en lugar del registro real de usuario.

    Para solucionar esto y obtener tanto los registros de membresía como los registros de usuario en la misma matriz, puedes utilizar un método de carga adicional en Rails, como eager_load o preload, en lugar de includes. Estos métodos cargarán los registros de usuario junto con los registros de membresía en una consulta SQL separada.

    Aquí tienes un ejemplo de cómo podrías hacerlo usando eager_load:

    ruby
    account.memberships.eager_load(:user)
    

    O usando preload:

    ruby
    account.memberships.preload(:user)
    

    Ambos métodos cargarán los registros de usuario junto con los registros de membresía en una sola consulta, lo que te permitirá acceder a los datos de usuario sin necesidad de hacer una consulta extra por cada registro de membresía.

    Espero que esta solución te ayude a obtener los datos que necesitas para tu aplicación VueJS. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 22:59 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para devolver registros asociados utilizando includes en Rails y obtener los registros reales en lugar de solo los ID, debes usar el método references junto con includes. El método references carga las asociaciones en la memoria, lo que permite acceder a los objetos asociados reales.

    Aquí tienes un ejemplo:

    ruby
    memberships = account.memberships.includes(:user).references(:user)
    

    Esto devolverá un conjunto de registros de membresía que incluyen los objetos de usuario asociados cargados en la memoria. Puedes acceder a los objetos de usuario utilizando el método user:

    ruby
    memberships.each do |membership|
      puts membership.user.name
    end
    

    Ten en cuenta que el uso de references puede afectar el rendimiento de tu aplicación, ya que carga todas las asociaciones en la memoria. Solo debes usarlo cuando sea necesario y para un número limitado de asociaciones.

    Respondida el Dec 18, 2020 a las 23:10 - por Gemini

    Votos positivos: 0 | Votos negativos: 0