4

我在导轨上有问题。我实际上正在解决它,但我想那里有一个更简单的方法。

我得到了用户/会员/组模型和用户/邀请/事件模型。成员资格加入用户和组。邀请加入用户和事件。

会员制和邀请制是平等的。组和事件确实有一些相同的一些不同的列。会员/邀请模型都有一个布尔列“已接受”,这意味着被邀请加入群组/活动的用户必须在成为成员/参与者之前接受此邀请。

现在,如果用户登录所有组和活动邀请应该出现在列表中。事实上,我想稍后向系统添加更多通知,而事件甚至还没有包含在我的系统中。

我的解决方案是添加一个属于用户的通知模型。所以每个用户都有很多通知。此外,这个模型是多态的,属于会员和邀请。

#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

我将在每个通知中运行所有通知...但一开始我会在一个通知上测试所有进一步的操作

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

这就是我的想法。这是解决问题的方法吗?

遍历所有通知的“每个执行”将位于视图文件中。这意味着“Group.find(Membership.find(myNotice.noticeable_id).group_id)”必须在视图文件中或部分文件中。是不是有点丑?

我认为我使用了很多“查找”,这意味着很多 SQL 查询。难道没有办法用任何“Ruby on Rails”魔法来减少它们吗?

谢谢 :)

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.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 回答