开发者

Complex Active-Relation active relation Rails Join Query with multiple relational tables

I have a user model that can "follow" some tags

User
  has_many :tag_followings 
  has_many :tags, :through => :tag_followings 

Then I have some articles that have also some tags attached.

Article
  has_many :tag_attachings
  has_many :tags, :through => :tag_attachings

tag_attaching is a join table that has fields of: user_id and tag_id and tag_following is a join table th开发者_如何学Goat has fields of: article_id and tag_id

  • I'm using Rich Many to Many relations(join table have an id)

I'm trying to find an efficient way to find articles that have tags that the user is following.

Best practices?


Try using :include It should help out significantly, as it will eager load records from the associated table(s).

User
  has_many :tag_followings 
  has_many :tags, :through => :tag_followings, :include => [:article]

Article
  has_many :tag_attachings
  has_many :tags, :through => :tag_attachings, :include => [:user]

Your statement to retrieve the data, might look like:

User.find(1).tags.collect { |t| t.article.id }

The executed from your log/development.log should go from:

User Load (0.3ms)  SELECT users.* FROM users WHERE (users.id = 1) LIMIT 1
Tag Load (1.2ms) SELECT tags.* FROM tags WHERE (users.tag_id =1)
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id = 1)
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id = 3)
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id = 7)

to:

User Load (0.3ms)  SELECT users.* FROM users WHERE (users.id = 1) LIMIT 1
Tag Load (1.2ms) SELECT tags.* FROM tags WHERE (users.tag_id =1)
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id IN (1,3,7))
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜