2

私は3つのモデルを持っています

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

タグのIDはわかっています。モデルtag_idを通じて、特定の を持つすべての投稿を照会したいと思います。Taggings

何かのようなもの

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

Postしかし、モデルではなくモデルでtag_id を探しているため、これは機能しませんTagging

これを行う方法がわかりません。

4

4 に答える 4

16

私は ActiveRecord クエリで文字列を使用したくないので、次の構文を好みます。

@post = Post.joins(:taggings).where(taggings: {tag_id: 17})
于 2014-10-15T00:46:20.983 に答える
7

初めに :

 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

あなたができるタグオブジェクトを持っているなら

 @posts = @tag.posts 

また

 class Post < .... 
   ....
   def self.find_by_tag_id(tag_id)
      Post.joins(:taggings).where('taggings.tag_id = ?', tag_id)
   end
 end
于 2012-11-07T21:20:07.763 に答える
2

.where 形式を使用すると、結合されたタグ付けテーブルを修飾するために .where("taggings.tag_id = ?", 17) のような文字列を渡すことができます。

于 2012-11-07T21:14:26.503 に答える
1

@tharrisonが述べたように。解決策は次のとおりです。

@post = Post.joins(:taggings).where("taggings.tag_id = ?", 17)
于 2012-11-07T21:11:51.163 に答える