Rails加入查询

时间:2012-11-07 20:48:04

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord

我有三个模特

  • 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 个答案:

答案 0 :(得分:11)

我不想在ActiveRecord查询中使用字符串,所以,我更喜欢这个sintax:

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

答案 1 :(得分: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

答案 2 :(得分:2)

使用.where格式,您可以传递类似.where(“taggings.tag_id =?”,17)的字符串来限定连接的标记表。

答案 3 :(得分:1)

正如@tharrison所说。解决方案是:

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