セットアップ
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