Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

365
Vistas
¿Cómo acceder a has_many a través de la relación posible en los rieles?

¿Cómo puedo acceder a mis registros relacionados?

 class Post < ActiveRecord::Base has_many :post_categories has_many :categories, through: :post_categories class Categories < ActiveRecord::Base has_many :post_categories has_many :post, through: :post_categories class PostCategories < ActiveRecord::Base belongs_to :post belongs_to :category

La tabla PostCategories tiene columnas id, posts_id y categorias_id.

 id | posts_id | categories_id 1. | 2 | 3 2. | 2 | 4

Lo que quiero es: obtener publicaciones relacionadas con una categoría. Me gusta: todas las Posts where x category .

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Sí, esta es fácil.

 one_or_more_categories = # Category.find... or Category.where... posts = Post.joins(:categories).where(category: one_or_more_categories)

Rails es lo suficientemente inteligente como para tomar un modelo o una consulta que encontraría algunos datos y los convertiría en una consulta adecuada y eficiente, que podría ser una subconsulta. Probar cosas en la consola de Rails ( bundle exec rails c ) es una buena manera de ver el SQL generado y comprender mejor lo que sucede.

(EDITAR: como señala otra respuesta, si ya recuperó una instancia de categoría específica, puede hacer referencia a category.posts y trabajar con esa relación directamente, incluido el encadenamiento en .order , .limit , etc.).

Otra forma de escribirlo 'nivel inferior' sería:

 Post.joins(:categories).where(category: {id: one_or_more_category_ids})

...que es, en esencia, lo que Rails hará bajo el capó cuando se le proporcione una instancia de modelo ActiveRecord o una relación ActiveRecord::. Si ya conocía, por ejemplo, la categoría "nombre", o alguna otra columna de texto indexada en la que podría buscar, entonces ajustaría lo anterior en consecuencia:

 Post.joins(:categories).where(category: {name: name_of_category})

El patrón de joins y where tomar un Hash donde el nombre de la tabla de unión se usa como una clave con valores anidados debajo puede tomarse tan profundo como desee (por ejemplo, si las categorías tenían muchas subcategorías) y puede encontrar más sobre eso en Rails Guías o búsquedas web adecuadas. El único problema es el tortuoso singular/plural, que Rails usa para tratar de hacer las cosas más "inglesas", pero a veces, como en este caso, solo crea una carga cognitiva adicional de tener que recordar qué partes deben ser singulares y cuáles. plural.

over 4 years ago · Santiago Trujillo Denunciar

0

No estoy seguro si esto responde, pero en ActiveRecord su Post tendrá acceso directo a su modelo de Category y viceversa. Por lo tanto, puede identificar la categoría de la que desea las publicaciones en una variable o una variable de instancia y consultar @specific_category.posts . Si está haciendo esto en su controlador, incluso podría hacerlo en el filtro before_action . Si lo está utilizando en serializadores, no es muy diferente.

También puede crear un alcance en su modelo Post y usar un registro activo o SQL sin procesar para consultar parámetros específicos.

También tiene un error en su modelo de Category . Has many siempre es plural por lo que sería has_many :posts, through: :post_categories

over 4 years ago · Santiago Trujillo Denunciar

0

Obtenga el objeto de categoría y puede obtener directamente las publicaciones relacionadas. Por favor vea lo siguiente

 category = Category.find(id) posts = category.posts

Dado que ya configuró la relación has_many_through, Rails obtendrá registros de publicaciones relacionados con la categoría.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda