所以我有三个型号:
用户模型
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
我做错了什么?
答案 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。