2012-01-14 128 views
0

所以我有三种模式:ActiveRecord的多关联查询

  • 用户
  • 用户兴趣
  • 兴趣标签

用户模型

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 

使用者兴趣模型

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 

我做错了什么?

+0

通过执行解决:@user = User.find(current_user.id,:include => {:user_interests =>:interest_tag}) – Elliot 2012-01-14 23:55:27

回答

1

您必须在User模型上添加一个has_many :through关联。

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

我假设你正在构建一个标签系统,就像在stackoverflow中一样:每个用户可以有多个他们感兴趣的标签。在这种情况下,user_interests表只是一个连接表,并且不需要模型。在两个真实模型上只需使用has_and_belong_to_many

另请参阅this article以不同方式实现具有或多或少标准化关系数据库的标记。你也可以使用像Mongodb这样的非关系数据库,你只需要一个表来做标记,参见the cookbook