Комплекс Active-Relation с активным отношением Rails Join Query с несколькими реляционными таблицами - PullRequest
0 голосов
/ 21 января 2011

У меня есть пользовательская модель, которая может «следовать» за некоторыми тегами

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

Тогда у меня есть несколько статей, к которым также прикреплены некоторые теги.

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

tag_attaching - это таблица соединений, которая имеет поля: user_id и tag_id а tag_following - это таблица соединений, которая имеет поля: article_id и tag_id

  • Я использую отношения Rich Many to Many (у объединяемой таблицы есть идентификатор)

Я пытаюсь найти эффективный способ найти статьи с тегами, за которыми следит пользователь.

Лучшие практики?

1 Ответ

1 голос
/ 27 января 2011

Попробуйте использовать : включите Это должно значительно помочь, так как будет загружать записи из связанных таблиц.

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]

Ваш оператор для извлечения данных может выглядеть следующим образом:

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

Выполнение из вашего log / development.log должно быть из:

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)

до:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...