¿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 .
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.
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
Obtenga el objeto de categoría y puede obtener directamente las publicaciones relacionadas. Por favor vea lo siguiente
category = Category.find(id) posts = category.postsDado que ya configuró la relación has_many_through, Rails obtendrá registros de publicaciones relacionados con la categoría.