Rails - 如何为某些事件提供用户通知消息

时间:2012-12-22 22:40:27

标签: ruby-on-rails ruby polymorphism alert

我在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

我将通过每个操作完成所有通知......但是一开始我在一个通知上测试所有进一步的操作

myNotice = myUser.notifications.first

因此,myNotices的noticeable_type是会员资格还是邀请函,我会将其作为群组或事件通知呈现 在这种情况下,noticeable_type = membership

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

- &GT;您想加入群组“myGroup.name”吗?是的|否

开启是:Membership.find(myNotice.noticeable_id).accepted = true

开号码:Membership.find(myNotice.noticeable_id).destroy

并且:myNotice.destroy

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

通过所有通知的“each do”将位于视图文件中。这意味着“Group.find(Membership.find(myNotice.noticeable_id).group_id)”必须在视图文件中或部分中。这不是有点难看吗?

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

谢谢:)

1 个答案:

答案 0 :(得分: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