4

Railsに問題があります。私は実際にそれを解決していますが、私はそこにもっと簡単な方法があると思います。

ユーザー/メンバーシップ/グループモデルとユーザー/招待/イベントモデルを取得しました。メンバーシップはユーザーとグループに参加します。招待状はユーザーとイベントに参加します。

メンバーシップと招待モデルは同じです。グループとイベントには、いくつかの等しいいくつかの異なる列があります。メンバーシップ/招待モデルには両方とも「承認済み」というブール列があります。つまり、グループ/イベントに招待されたユーザーは、メンバー/参加者になる前にこの招待を承認する必要があります。

これで、ユーザーがすべてのグループにサインインすると、イベントの招待状がリストに表示されます。実際、後でシステムに通知を追加したいのですが、イベントはまだ私のものに含まれていません。

私の解決策は、ユーザーに属する通知モデルを追加することです。したがって、すべてのユーザーには多くの通知があります。さらに、このモデルは多形であり、メンバーシップと招待に属します。

#user model
class User < ActiveRecord::Base
    has_many :memberships, :dependent => :destroy
    has_many :groups, :through => :memberships
    has_many :invitations, :dependent => :destroy
    has_many :events, :through => invitations
    has_many :notifications  

#membership model (equal to invitation model)
class Membership < ActiveRecord::Base
    belongs_to :user
    belongs_to :group
    has_one :notifications, :as => :noticeable

#group model (equal to event model but participants for members and invitation for membership)
class Group < ActiveRecord::Base
    has_many :memberships
    has_many :users, :through => :memberships   
    has_many :members, :through => :memberships, :source => :user,
                :conditions => ['memberships.accepted = ?', true]

#notification model
class Notification  < ActiveRecord::Base
    belongs_to :user
    belongs_to :noticeable, :polymorphic => true

データベースにいくつかのデータを追加し、コンソールでテストしています

myUser = User.find(6) # will be exchanged with current_user in the actual program

私はすべての通知を実行するたびに実行します...しかし、最初に、1つの通知でそれ以降のすべてのアクションをテストします

myNotice = myUser.notifications.first

したがって、myNoticesのnoticeable_typeがメンバーシップであるか招待であるかにかかわらず、この場合はグループ通知またはイベント通知としてレンダリングします。noticeable_type= membership

myGroup = Group.find(Membership.find(myNotice.noticeable_id).group_id)

->グループ「myGroup.name」に参加しますか?はい| いいえ

はいの場合:Membership.find(myNotice.noticeable_id).accepted = true

いいえ:Membership.find(myNotice.noticeable_id).destroy

と:myNotice.destroy

それが私の考えです。これは問題を解決する方法ですか?

すべての通知を通過する「eachdo」はビューファイルにあります。つまり、「Group.find(Membership.find(myNotice.noticeable_id).group_id)」がビューファイルまたは部分的に含まれている必要があります。それは少し醜いではありませんか?

私は多くの「検索」を使用したと思います。これは多くのSQLクエリを意味します。「RubyonRails」(魔法)でそれらを減らす方法はありませんか?

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

4

2 に答える 2

1

私のアプリに似たようなものが必要だったので、誰かがそれが役に立つと思った場合に備えて、ここで答えを更新してください。

  #user model

   has_many :membership_notices, :through => :notifications, :source => :membership,  :conditions => {"notifications.noticeable_type" => "membership"}

   has_many :event_notices, :through => :notifications, :source => :event ,:conditions => {"notifications.noticeable_type" => "event"}

通知は次のようにアクセスできるようになりました

  user.membership_notices
  user.event_notices
于 2013-09-18T09:44:25.043 に答える
0

最後に、これを解決する方法を見つけました!私は再びこの問題にぶつかり、「逆多形」をグーグルで検索しました。次の投稿を見つけました: https ://gist.github.com/runemadsen/1242485

ポリモーフィックアソシエーションが逆転しました。 Railsでポリモーフィックな関連付けを行うのは非常に簡単です。画像はBlogPostまたはArticleのいずれかに属することができます。しかし、逆の関係が必要な場合はどうなりますか?写真、テキスト、およびビデオはArticleに属することができ、その記事は@ article.mediaを呼び出すことによってすべてのメディアを見つけることができます。この例は、多態的な関係を処理するArticleElement結合モデルを作成する方法を示しています。すべてのポリモーフィックモデルに共通のフィールドを追加するには、結合モデルにフィールドを追加します。

       class Article < ActiveRecord::Base
          has_many :article_elements
          has_many :pictures, :through => :article_elements, :source => :element, :source_type => 'Picture'
          has_many :videos, :through => :article_elements, :source => :element, :source_type => 'Video'
        end

        class Picture < ActiveRecord::Base
          has_one :article_element, :as =>:element
          has_one :article, :through => :article_elements
        end

        class Video < ActiveRecord::Base
          has_one :article_element, :as =>:element
          has_one :article, :through => :article_elements 
        end

        class ArticleElement < ActiveRecord::Base
          belongs_to :article
          belongs_to :element, :polymorphic => true
        end

        t = Article.new
        t.article_elements  # []
        p = Picture.new
        t.article_elements.create(:element => p)
        t.article_elements  # [<ArticleElement id: 1, article_id: 1, element_id: 1, element_type: "Picture", created_at: "2011-09-26 18:26:45", updated_at: "2011-09-26 18:26:45">]
        t.pictures # [#<Picture id: 1, created_at: "2011-09-26 18:26:45", updated_at: "2011-09-26 18:26:45">]
于 2015-09-10T09:06:02.297 に答える