我有三个模特
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
模型。
我不知道该怎么做。
答案 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)