0

サインイン時にユーザーごとにボタンを配置Users listする必要がある、があります。follow/unfollow

トピック/グループなどをフォローするために同じ方法を使用したい場所は他にもいくつかあります。したがって、これらのボタンが必要になるたびに追加のクエリを回避するために、関連付けを作成するのが最善だと思います。

user_followingsのテーブル構造

| id | user_id | recipient_id | 
| 1  | 1       | 2            | 
| 2  | 3       | 2            | 
| 3  | 10      | 3            |

したがって、ここではid=1のuserがuser=>2の後に続きます。

つまり、基本的にhas_many、ユーザーは他の多くのユーザーをフォローしているため、関連付けタイプがあります。has_oneしかし、アソシエーションタイプを追加するというアイデアを思いつきました。この場合、追加の条件recipient_id=current_user.idを設定して、レコードが1つだけ残り、次のステータスが表示されるようにします。

これを成功させると、追加のクエリやキャッシュなどを使用せずに、ビューをassociation介して次のステータスを非常に簡単に確認できます。user.following.nil?

以前にCakePHPアプリでこれを作成したことがありますが、SQLクエリは次のようになります。

ON (`UserFollowing`.`recipient_id` = `User`.`id` AND `UserFollowing`.`user_id` = 1)

しかし、CakePHPはその場でリレーションをバインドできるので、セッションからcurrent_user.idをアソシエーション条件に直接追加しました。

current_user.id条件を記述するためのモデルを入れることができないため、Railsではこれを行うことができません。

user.rb
has_one :following, :class_name => 'UserFollowing', :conditions => {:user_id => current_user.id}

メソッドNb。2

を使用してこれを解決できるかもしれませんが、関連付けを行っているのと同じテーブルから:through結果を取得する例が見つかりません。users

メソッドNb。3

Rails 3デバイスのスコープを使用していますか?モデルではcurrent_userにアクセスできませんか?

わからない、どちらの方法が最適か...

4

3 に答える 3

0

この質問については、特に第11章をお読みください。Twitterのようなアプリの構築に関するAZの本全体を読んでください。

RubyOnRailsチュートリアル

于 2013-03-26T16:35:08.900 に答える
0

それはあなたの質問への直接の答えではありませんが:宝石を考えてください:acts_as_follower。私は同じような状況でそれを使用しました、そしてそれはあなたのニーズに合うようです。何でも他のものに従わせることが可能です-それをチェックしてください...

于 2013-03-26T18:36:14.757 に答える
0

さて、私はスコープでこれを行う方法を見つけました:

  # user.rb
  scope :with_relations, lambda { |current_user_id|
    has_one :user_following, :foreign_key => 'recipient_id', :conditions => {:user_id => current_user_id}
    where(:status => 1)
  }

  # users_controller.rb
  @users = User.with_relations(current_user.id).limit(30).order('last_action desc')
于 2013-03-26T18:59:55.407 に答える