2

セットアップ

3つの主要なテーブル(ユーザー、リンク、トピック)と2つの結合テーブル(link_savesとlink_topics)を持つデータモデルがあります。私のモデル:

ユーザー

has_many :link_saves, :class_name => 'LinkSave', :foreign_key => 'user_id'
has_many :links, :through => :link_saves

LinkSave

belongs_to :user
belongs_to :link

リンク

has_many :link_saves, :class_name => 'LinkSave', :foreign_key => 'link_id'
has_many :users, :through => :link_saves

has_many :link_topics, :inverse_of => :link
has_many :topics, :through => :link_topics

LinkTopic

belongs_to :link
belongs_to :topic

トピック

has_many :link_topics
has_many :links, :through => :link_topics

質問

ユーザーがリンクを保存したすべてのトピックのリストを見つけられるようにしたいと思います。@user.topicsユーザーからトピックに至るまで、5つのテーブルすべてにまたがって実行できるようにしたいと思います。さらに重要なことに、これでActiveRecordリレーションを返し、ユーザートピックのリストをさらにスコープ/ソート/ページングして、これが機能しないようにします。

## app/models/user.rb

def topics
  links.collect(&:topics)
end

私は間違った道を進んでいますか?すべてのカスタムSQLを作成せずに、アクティブレコードを介してこれを行う方法はありますか?助けてください!

考えられる答え(更新)

複数has_many :throughのを使用してすべてのホップを作成します。これは機能しますが、ベストプラクティスにはなりませんよね?

## app/models/user.rb
has_many :link_saves, :class_name => 'LinkSave', :foreign_key => 'user_id'
has_many :links, :through => :link_saves
has_many :link_topics, :through => :links, :uniq => true
has_many :topics, :through => :link_topics, :uniq => true
4

1 に答える 1

0

これは「ネストされた」has_many スルーと呼ばれ、基本的に A から B、C に移動すると思います。

Rails 3.1 では、この機能がサポートされるようになりました http://www.warmroom.com/yesterdays/2011/08/30/rails-3-1-nested-associations/

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html (「ネスト」を検索)

彼らが持っている例はあなたが持っているものより少し単純ですが、いくつかのアイデアを得るにはそれで十分だと思います.

class Author < ActiveRecord::Base
  has_many :posts
  has_many :comments, :through => :posts
  has_many :commenters, :through => :comments
end

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :commenter
end

@author = Author.first
@author.commenters # => People who commented on posts written by the author

Rails 3.1より前は、プラグイン「https://github.com/releod/nested_has_many_through」がありました

于 2011-11-30T18:44:31.090 に答える