Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

359
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!