ActiveRecord多关联查询

时间:2012-01-14 23:38:41

标签: mysql ruby-on-rails ruby-on-rails-3 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

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 个答案:

答案 0 :(得分:1)

您必须在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 gem。

答案 1 :(得分:0)

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

另请参阅this article,了解使用更多或更少规范化的关系数据库实现标记的不同方法。您也可以使用像Mongodb这样的非关系型数据库,只需要一个表来进行标记,请参阅the cookbook