6

ユーザーとプロジェクトの2つのモデルがあります。アイデアは、ユーザーがプロジェクトと他のユーザーの両方をフォローできるということです。当然、ユーザーとプロジェクトは多形の「フォロー可能」タイプの一部です。ここで、ユーザーモデルを使用して、次の3つのことを取得したいと思います。

user.followed_users
user.followed_projects
user.followers

最初の2つは正常に機能します。私が問題を抱えているのは3番目です。これは一種の逆引き参照であり、外部キーが次の表の「followable_id」列になりますが、どのようにモデル化しても、クエリを正しく実行できません。

ユーザーモデル

has_many :follows, :dependent => :destroy
has_many :followed_projects, :through => :follows, :source => :followable, :source_type => "Project"
has_many :followed_users, :through => :follows, :source => :followable, :source_type => "User"
has_many :followers, :through => :follows, :as => :followable, :foreign_key => "followable", :source => :user, :class_name => "User"

モデルに従う

class Follow < ActiveRecord::Base
  belongs_to :followable, :polymorphic => true
  belongs_to :user
end

私のフォローテーブルには次のものがあります:user_id followable_id followable_type

クエリを実行するたびに、次のようになります。

SELECT `users`.* FROM `users` INNER JOIN `follows` ON `users`.`id` = `follows`.`user_id` WHERE `follows`.`user_id` = 7

ここで、「user_id = 7」ではなく、「followable_id = 7 AND followable_type='User」にする必要があります。

何かご意見は?

4

2 に答える 2

6

理解した。Michael Hartl が作成したサンプル プロジェクトを見て、これを行う正しい方法は、関係テーブル (この場合は follow) だけでなく、逆関係テーブル (reverse follow と呼びます) も指定することであることに気付きました。

    has_many    :follows,
                        :dependent => :destroy

    has_many    :followed_projects,
                        :through => :follows,
                        :source => :followable,
                        :source_type => "Project"

    has_many    :followed_users,
                        :through => :follows,
                        :source => :followable,
                        :source_type => "User"

    has_many    :reverse_follows,
                        :as => :followable,
                        :foreign_key => :followable_id,
                        :class_name => "Follow"

    has_many    :followers,
                        :through => :reverse_follows,
                        :source => :user

これが何人かの人々を助けてくれることを願っています!

于 2012-05-07T22:19:25.517 に答える
0

外部キーを明示的に綴る必要があると思います。あなたが持っている:

:foreign_key => "followable"

必要なもの:

:foreign_key => "followable_id"

完全なコード:

has_many :followers, :through => :follows, :as => :followable, :foreign_key => "followable_id", :source => :user, :class_name => "User"
于 2012-05-05T00:06:24.450 に答える