私は3つのモデルを持っています:ユーザー、リスト、フォロー中
私はシステムを実装しようとしています。
- ユーザーは多くのリストを作成できます (リストには写真が含まれていますが、この質問には関係ありません)。
- ユーザーは、他のユーザーが作成したリストをフォローできます
このシステムを構築しようとしている方法は次のとおりです。
まず、リストのデータベース テーブルがあります。
lists: id, user_id
そして、次のようにモデルを指定します。
class User < ActiveRecord::Base
has_many :lists
end
class List < ActiveRecord::Base
belongs_to :user
end
問題なくできますUser.first.lists
。
フォロワーシップを作成しようとすると、私の課題が発生します。ユーザーが見つけられるようにしたい
- 彼がフォローしているすべてのリスト
- 彼が作成したフォロー中のすべてのリスト
- 彼のリストをフォローしているすべてのユーザー (つまり、すべての「フォロワー」)
上記の機能を満たすために使用しようとしているデータベーステーブルは次のとおりです。
followings: user_id, list_id, list_user_id
このテーブル定義では、user_id
誰がリストをフォローしているかを指定し、フォローしているリストをlist_id
指定し、フォローしてlist_user_id
いるリストの所有者を指定します。ここでは、データベース検索を高速化するために使用されているため、テーブルとテーブルlist_user_id
を結合する必要はありません。lists
users
そして今、私は立ち往生しています。ユーザーモデルを次のように変更しようとしました。
class User < ActiveRecord::Base
has_many :lists
has_many :followings
# Works
has_many :following_lists, :through => :followings, :class_name => "List", :source => :list
# Doesn't work
has_many :followed_lists, :through => :followings, :class_name => "List", :source => :list, :conditions => {:list_user_id => self.id}
# Doesn't work
has_many :followers, :through => :followings, :class_name => "User", :source => :user
end
最初の目標である「彼がフォローしているすべてのリストを見つける」は、has_many :following_lists
問題なく達成されました。しかし、ユーザーの「フォローしている全リスト」「全フォロワー」を取得するのは難しいようです。
followings
問題は、テーブルのルックアップに使用するキーを指定する方法がないように見えることです。たとえば、ユーザー A のフォロワーを検索する場合、 equalsでfollowings
あるテーブル内のすべての行を検索する必要がありますが、メソッドはこれを行うためのオプションを提供しておらず、条件も機能しません(文句を言うでしょう)。list_user_id
A.id
has_many
:conditions => {:list_user_id => self.id}
undefined method 'id'
では、この状況にどのように対処しますか?テーブルを設計するためのより良い方法はありますか、または現在のテーブル定義に基づいて実際に何かを解決することはできますか?
ところで、Following
モデルの定義方法は次のとおりです。
class Following < ActiveRecord::Base
attr_accessible :list_id, :list_user_id, :user_id
belongs_to :user
belongs_to :list
belongs_to :list_user, :class_name => "User"
end