私はクライアント用にRailsプロジェクトを設定していますが、ユーザー(モデル)が(Twitterのように)お互いをフォローできるようにしたいと考えています。また、あるユーザーが別のユーザーをフォローし始めた時期を追跡できるようにしたいとも考えています。
作成日を追跡する必要があるので、has_many X, :through => Y
関係が進むべき道であると考えました。したがって、Yは作成日を追跡します。
フォローモデルを設定しました:
class Follow < ActiveRecord::Base
attr_accessible :actor_id, :observer_id, :follower, :followee
attr_readonly :actor_id, :observer_id, :follower, :followee
belongs_to :follower, :class_name => 'User', :foreign_key => :observer_id
belongs_to :followee, :class_name => 'User', :foreign_key => :actor_id
validates_presence_of :follower, :followee
validates_uniqueness_of :actor_id, :scope => :observer_id
end
問題は、ユーザーモデルでリレーションを設定するにはどうすればよいですか?
理想的には、次のものが必要です。
:follows
関連付けられたFollowオブジェクトになります。selfはfollower(observer_id)です。:followed
関連付けられたFollowオブジェクトになります。selfはfollowee(actor_id)です。:following
関連付けられたUserオブジェクトであり、selfはフォロワー(observer_id)です。:followers
関連付けられたUserオブジェクトであり、selfはfollowee(actor_id)です。
has_many :through
パーツの書き方がわかりませんが?またはを使用する必要があります:source => X
かforeign_key => X
?そして、どのキー(actor_idまたはobserver_id)をそれぞれに入れる必要がありますか?
編集:私は現在これを行っています
has_many :follows, :foreign_key => :observer_id
has_many :followed, :class_name => 'Follow', :foreign_key => :actor_id
has_many :following, :class_name => 'User', :through => :follows, :source => :followee, :uniq => true
has_many :followers, :class_name => 'User', :through => :follows, :source => :follower, :uniq => true
そしてそれはほとんど機能しています。それらのすべては:followers
正常に動作しますが、user.followers
何か奇妙なことをしています。ユーザーが誰かをフォローしているかどうかをチェックしているuser.followers
ようです。フォローしている場合は、ユーザーのみを含む配列を返します。そうでない場合は、空の配列を返します。
誰かアドバイスはありますか?