Rails se une a la consulta

Tengo tres modelos

  • Tag => :id :name
  • Tagging => :id :tag_id :post_id
  • Post => :id :summary

Conozco la identificación de la etiqueta. Me gustaría consultar todas las publicaciones que tienen un tag_id específico, a través del modelo de Taggings .

Algo como

 @post = Post.joins(:taggings).where(:tag_id => 17) 

pero esto no funciona porque busca el tag_id en el modelo Post y no el modelo Tagging .

No estoy seguro de cómo hacer esto.

Usando el formato .where, puede pasar una cadena como .where (“taggings.tag_id =?”, 17) para calificar la tabla de etiquetados unidos.

No me gusta usar cadenas en las consultas de ActiveRecord, así que prefiero esta syntax:

 @post = Post.joins(:taggings).where(taggings: {tag_id: 17}) 

Ante todo :

  class Post < ActiveRecord::Base has_many :taggings has_many :tags, :through => :taggings end class Taggins < ActiveRecord::Base belongs_to :post belongs_to :tag end class Tag < ActiveRecord::Base has_many :taggings has_many :posts, :through => :taggings end 

Si tienes el objeto tag puedes hacerlo.

  @posts = @tag.posts 

o

  class Post < .... .... def self.find_by_tag_id(tag_id) Post.joins(:taggings).where('taggings.tag_id = ?', tag_id) end end 

Como mencionó @tharrison. Una solución es:

 @post = Post.joins(:taggings).where("taggings.tag_id = ?", 17)