ActiveRecord的多关联查询
问题描述:
所以我有三种模式: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
我做错了什么?
答
您必须在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宝石为您的要求。
答
我假设你正在构建一个标签系统,就像在stackoverflow中一样:每个用户可以有多个他们感兴趣的标签。在这种情况下,user_interests表只是一个连接表,并且不需要模型。在两个真实模型上只需使用has_and_belong_to_many。
另请参阅this article以不同方式实现具有或多或少标准化关系数据库的标记。你也可以使用像Mongodb这样的非关系数据库,你只需要一个表来做标记,参见the cookbook。
通过执行解决:@user = User.find(current_user.id,:include => {:user_interests =>:interest_tag}) – Elliot 2012-01-14 23:55:27