0

私は3つのモデルを持っています:ユーザー、リスト、フォロー中

私はシステムを実装しようとしています。

  • ユーザーは多くのリストを作成できます (リストには写真が含まれていますが、この質問には関係ありません)。
  • ユーザーは、他のユーザーが作成したリストをフォローできます

このシステムを構築しようとしている方法は次のとおりです。

まず、リストのデータベース テーブルがあります。

lists: id, user_id

そして、次のようにモデルを指定します。

class User < ActiveRecord::Base
  has_many :lists
end
class List < ActiveRecord::Base
  belongs_to :user
end

問題なくできますUser.first.lists

フォロワーシップを作成しようとすると、私の課題が発生します。ユーザーが見つけられるようにしたい

  1. 彼がフォローしているすべてのリスト
  2. 彼が作成したフォロー中のすべてのリスト
  3. 彼のリストをフォローしているすべてのユーザー (つまり、すべての「フォロワー」)

上記の機能を満たすために使用しようとしているデータベーステーブルは次のとおりです。

followings: user_id, list_id, list_user_id

このテーブル定義では、user_id誰がリストをフォローしているかを指定し、フォローしているリストをlist_id指定し、フォローしてlist_user_idいるリストの所有者を指定します。ここでは、データベース検索を高速化するために使用されているため、テーブルとテーブルlist_user_idを結合する必要はありません。listsusers

そして今、私は立ち往生しています。ユーザーモデルを次のように変更しようとしました。

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_idA.idhas_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
4

1 に答える 1