0

私は Rails を初めて使用し、Michael Hartl の「Ruby on Rails 3 チュートリアル」を完了しました。この本は私に多くのことを教えてくれますが、このパズルは私には理解できません。

User モデル内でパズル、つまり、わからないことをプレビューするには、

has_many :following, :through=>:relationship, :source=>:followed

このコードが「user.following」を User インスタンスの配列にリンクする方法。

そして下はパズル全体です。

まず、followed_idおよびfollower_id情報を記録するRelationshipモデルがあります。リレーションシップモデルの内部では、関連付けは次のように単純です。

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

  belongs_to :follower, :class_name => "User"
  belongs_to :followed, :class_name => "User"
end

次に、 User モデル内で、ユーザーはfollowerの役割を引き受け、関係の関連付けを通じて関係テーブル内の後続のすべての行を収集します。

class User < ActiveRecord::Base
  .
  .
  .
  has_many :relationships, :foreign_key => "follower_id", :dependent => :destroy
  .

今まで、私はそれを手に入れました。

しかし、次の行で混乱が生じました。ここでは、user.followingを使用して、そのユーザーのすべてのフォロー (ユーザー インスタンス) を組み立てることができます。そのようです、

has_many :following, :through=>:relationships, :source=>:followed

:source=>:followedがデフォルトを上書きし、そのユーザーに関連付けられているすべてのfollowed_idsを見つけさせることを理解しています。

しかし、Rails はどうやってfollowed_idを認識してUserオブジェクトにリンクするのでしょうか? ラベル名がusersと一致しないか、 :class_nameが指定されていません。Rails がこの基礎となる作業をどのように行っているのか理解できないか、いくつかのヒントを見逃していました。

ありがとうございました!:)

4

2 に答える 2

1

しかし、Rails はどうやって followed_id を認識して User オブジェクトにリンクするのでしょうか? ラベル名がユーザーと一致しないか、:class_name が指定されていません。Rails がこの基礎となる作業をどのように行っているのか理解できないか、いくつかのヒントを見逃していました。

Rails は、これがユーザー オブジェクトであることを認識します。ここで Rails が行うことは、外部キー "follower_id" を介してリレーションシップ クラスをたどり、現在のユーザーとリレーションシップを持つすべての User をフォローとして返すことです。もちろん、Rails は次のような単一の SQL ステートメントでそれを行います。

SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `relationships`.followed_id = `users`.id WHERE ((`relationships`.follower_id = <the current user id>  ))
于 2011-08-30T08:58:53.990 に答える
0
has_many :following, :through=>:relationships, :source=>:followed

これは、Rails にfollowingと の逆の関係であることを説明しfollowingています。

Rails がfollowed_idUser にリンクされていることを認識する方法は、それがRelationshipモデルで定義されているということです。

あなたが理解したホープ! 幸運を :)

于 2011-08-30T08:40:13.180 に答える