ActiveRecord Multi-запрос ассоциации - PullRequest
0 голосов
/ 15 января 2012

Итак, у меня есть три модели:

  • Пользователь
  • Интерес пользователя
  • Теги интереса

Модель пользователя

class User < ActiveRecord::Base
  has_many :user_interests 
end

Модель InterestTag

class InterestTag < ActiveRecord::Base
 has_many :user_interests, :dependent => :destroy

validates :name, :uniqueness => true

end

Модель UserInterest

class UserInterest < ActiveRecord::Base
  belongs_to :interest_tag
  belongs_to :user
end

Я хотел бы использовать ActiveRecord для включения имени интересов пользователя при загрузке его профиля с использованиемследующий запрос:

@user = User.find(current_user.id, :include => [{:user_interests => :interest_tags}])

Миграции для Interest_tags + user_interests

create_table :interest_tags do |t|
  t.string :name, :null => false, :size => 30
  t.timestamp :created_at
end

create_table :user_interests do |t|
  t.integer :user_id
  t.integer :interest_tag_id
end

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 15 января 2012

Вы должны добавить ассоциацию has_many :through для модели User.

class User < ActiveRecord::Base
  has_many :user_interests 
  has_many :interest_tags, :through => :user_interests
end

class UserInterest < ActiveRecord::Base
  belongs_to :interest_tag
  belongs_to :user
end

class InterestTag < ActiveRecord::Base
  has_many :user_interests, :dependent => :destroy
  validates :name, :uniqueness => true
end

Теперь вы можете загружать теги следующим образом:

User.find(current_user.id, :include => :interest_tags)

Примечание:

Возможно, вы захотите взглянуть на камень acts_as_taggable_on для вашего требования.

0 голосов
/ 15 января 2012

Я предполагаю, что вы создаете систему тегов, как в stackoverflow: у каждого пользователя kann есть несколько тегов, которые им интересны. В этом случае таблица user_interests является только таблицей соединений и не нуждается в модели. Просто используйте has_and_belong_to_many на двух реальных моделях.

См. Также эту статью о различных способах реализации тегов с более или менее нормализованными реляционными базами данных. Вы также можете использовать нереляционную базу данных, такую ​​как Mongodb, там вам понадобится только одна таблица для тегирования, см. поваренная книга .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...