2012-01-14 8 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 

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

@user = User.find(current_user.id、:include => {:user_interests =>:interest_tag}) – Elliot

答えて

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のような非リレーショナルデータベースを使用することもできます。そこには、タグ付けを行うテーブルが1つだけ必要です。the cookbookを参照してください。