7

私のアプリケーションでは、ユーザーは多くのユーザーをフォローでき、多くのユーザーがフォローできます。has_and_belongs_to_many 関連付けを使用してこれをモデル化しようとしました

class User < ActiveRecord::Base
  has_and_belongs_to_many :followers, class_name: "User", foreign_key: "followee_id", join_table: "followees_followers"
  has_and_belongs_to_many :followees, class_name: "User", foreign_key: "follower_id", join_table: "followees_followers"
end

また、次のように結合テーブルの移行を作成しました。

class FolloweesFollowers < ActiveRecord::Migration
  def up
    create_table 'followees_followers', :id => false do |t|
        t.column :followee_id, :integer
        t.column :follower_id, :integer
    end
  end

  def down
    drop_table 'followees_followers'
  end
end

ユーザーのフォロワー (User.first.followers) にアクセスしようとすると、エラーがスローされます。

SQLException: no such column: followees_followers.user_id: SELECT "users".* FROM "users" INNER JOIN "followees_followers" ON "users"."id" = "followees_followers"."user_id" WHERE "followees_followers"."followee_id" = 1

followees_followers.user_id にアクセスしている理由がわかりません。何か不足していますか?

4

2 に答える 2

13

:foreign_key および:association_foreign_keyオプションは、多対多の自己結合を設定するときに役立ちます。

class User < ActiveRecord::Base
  has_and_belongs_to_many :followers, class_name: "User", foreign_key: "followee_id", join_table: "followees_followers", association_foreign_key: "follower_id"
  has_and_belongs_to_many :followees, class_name: "User", foreign_key: "follower_id", join_table: "followees_followers", association_foreign_key: "followee_id"
end
于 2013-02-25T06:14:02.507 に答える
2

クラスuser_idのインスタンスからリレーションシップにアクセスしているため、フィールドにアクセスしようとすることは明らかです。User

あなたの関係に設定し、:association_foreign_key => "follower_id"あなたの関係に設定してみてください。followers:association_foreign_key => "followee_id"followees

于 2013-02-25T00:10:31.200 に答える