Rails joins query
15,406
Solution 1
Using the .where format you can pass a string like .where("taggings.tag_id = ?", 17) to qualify the joined taggings table.
Solution 2
I don't like to use string in ActiveRecord queries, so, I prefer this sintax:
@post = Post.joins(:taggings).where(taggings: {tag_id: 17})
Solution 3
First of all :
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
If you have the tag object you can do
@posts = @tag.posts
or
class Post < ....
....
def self.find_by_tag_id(tag_id)
Post.joins(:taggings).where('taggings.tag_id = ?', tag_id)
end
end
Solution 4
As @tharrison mentioned. A solution is:
@post = Post.joins(:taggings).where("taggings.tag_id = ?", 17)
Comments
-
1dolinski almost 2 years
I have three models
Tag
=>:id
,:name
Tagging
=>:id
,:tag_id
,:post_id
Post
=>:id
,:summary
I know the id of the tag. I would like to query for all of the posts that have a specific
tag_id
, through theTaggings
model.Something like
@post = Post.joins(:taggings).where(:tag_id => 17)
but this doesn't work because it is looking for the tag_id in the
Post
model and not theTagging
model.I'm not sure how to do this.
-
icantbecool about 7 yearsYou could also add additional conditions after taggings if needed
.where(taggings: {tag_id: 17}, tags: {valid: true})
-
gwalshington about 7 yearsJust a note here - the first 'taggings' needs to be singular, otherwise you will get the error:
association named not found perhaps misspelled issue in rails association
Reference: stackoverflow.com/questions/19231629/…