1

ユーザーモデルを備えたRails3.2アプリケーションがあります。次のユースケースによってトリガーできる通知メカニズムを追加したいと思います。

  • 誰かのプロフィールが好き
  • 誰かのプロフィールにコメントする
  • 誰かをフォローする

すべての場合において、一方のユーザーは、もう一方のユーザーが受け取る行動によって通知を生成します。したがって、通知の送信者と受信者があります。

私は今、自分の協会をどのように構成するかを考えています。これまでのところ、私のモデルは次のようになっています。

Notification.rb

attr_accessible :content, :read_at, :recipient_id, :sender_id

belongs_to :sender,     class: :user
belongs_to :recipient,  class: :user

User.rb

has_many :notifications, as: :recipient, dependent: :destroy, foreign_key: :recipient_id
has_many :notifications, as: :sender, dependent: :destroy, foreign_key: :sender_id

この擬似コードは、私が必要としているものを理解するのに役立つだけです。私が非常に混乱しているのは、通知モデル内でユーザーモデルを2回参照していることと、ユーザーが2つの異なる方法で多くの通知を持っていることです。

だから、私の質問は次のとおりです。

  • 上記の関連付けをどのように調整しますか?
  • あなたはそれらを何と呼びますか?
  • スコープを記述せずに、ユーザーモデルで送信されたすべての通知と受信されたすべての通知を呼び出すにはどうすればよいですか?
  • それはまったく正しいアプローチですか、それとも、ユーザーを2回参照しないように、どこかで結合テーブルを使用する必要がありますか?

ありがとう!

解決

シェーンの解決策を言葉で表現するには、これがモデルの外観です。思ったよりずっと楽でした。ここで魔法をかける必要があると思いましたが、Railsはその驚くべきシンプルさで再び私をだましました!そうですね、だから私はそれがとても好きです。

どうもありがとう、シェーン!

Notification.rb

attr_accessible :content, :read_at, :recipient, :recipient_id, :sender, :sender_id

belongs_to :sender, class_name: "User"
belongs_to :recipient, class_name: "User"

User.rb

has_many :received_notifications, class_name: "Notification", foreign_key: "recipient_id", dependent: :destroy
has_many :sent_notifications, class_name: "Notification", foreign_key: "sender_id", dependent: :destroy
4

1 に答える 1

3

これは完全に正常です。人気のあるオープンソースアプリであるRedmineで使用されているのと同じパターンの例を次に示します。

https://github.com/edavis10/redmine/blob/master/app/models/workflow_rule.rb#L23-L24

送信通知と受信通知の両方を取得する方法が必要な場合、ここでの回答は基本的なニーズに適しています。

Railsモデルhas_manyと複数のforeign_keys

于 2013-02-01T18:46:00.090 に答える