1

当用户喜欢评论create_notification被触发在commet_like.rb如何将模型与模型中的模型相关联?

class CommentLike < ActiveRecord::Base 
    after_create :create_notification 
    has_many :notifications 
    belongs_to :user 
    belongs_to :comment 
    validates :user, uniqueness: { scope: :comment } 
    belongs_to :liker, class_name: 'User', foreign_key: :user_id 
    belongs_to :liked_comment, class_name: 'Comment', foreign_key: :comment_id 

private 

    def create_notification 
    notifications.create(
     comment_like: self, 
     comment:  comment, 
     user:   comment.user,  
     read:   false 
    ) 
    end 
end 

我试图让这样的事情在通知指数工作:

<% if notification.comment_like_id %> 
    <% if notification.goal_id %> 
     liked <%= link_to "your comment", notification_goal_path(notification, notification.goal_id) %> 
    <% elsif notification.habit_id %> 
     liked <%= link_to "your comment", notification_habit_path(notification, notification.habit_id) %> 
    <% elsif notification.quantified_id %> 
     liked <%= link_to "your comment", notification_quantified_path(notification, notification.quantified_id) %> 
    <% elsif notification.valuation_id %> 
     liked <%= link_to "your comment", notification_valuation_path(notification, notification.valuation_id) %> 
    <% end %> 
    <% end %> 

但问题是这些条件中的每一条都不可用于评论,因此通知显示为空白。

正如你在这里虽然可以看到CommentLike与评论相关联,在本例中给出comment_id: 1comment_id: 1valuation_id: 1

[1] CommentLike.find(1) 
id: 1, 
user_id: 1, 
comment_id: 1, 
[2] Comment.find(1) 
id: 1, 
content: "test", 
goal_id: nil, 
habit_id: nil, 
valuation_id: 1, 
quantified_id: nil, 
commentable_id: nil, 
commentable_type: nil, 
user_id: 1, 
likes: 1> 

我们如何利用这个协会根据意见与其他4款协会做出正确的条件现身comment_like_id下?

notifications_controller

def index 
    @notifications = current_user.notifications 
    @notifications.each do |notification| 
     notification.update_attribute(:read, true) 
    end 
    end 

comment.rb

class Comment < ActiveRecord::Base 
    after_create :create_notification 
    has_many :notifications 
    has_many :comment_likes 
    has_many :likers, through: :comment_likes, class_name: 'User', source: :liker 
    belongs_to :habit 
    belongs_to :quantified 
    belongs_to :valuation 
    belongs_to :goal 
    belongs_to :user 

private 

    def create_notification 
    author = 
     if goal 
     goal.user 
     elsif habit 
     habit.user 
     elsif quantified 
     quantified.user 
     elsif valuation 
     valuation.user 
     end 
    notifications.create(
     comment:  self, 
     habit:  habit, 
     quantified: quantified, 
     goal:   goal, 
     valuation: valuation, 
     user:   author,  
     read:   false 
    ) 
    end 
end 

请让我知道如果你需要进一步的解释或代码: - ]

+0

怎么来评论通过相关联的所有其他车型代替commentable(它看起来像你有该领域,但不是协会) – DVG

回答

0

这里的关键是使用after_save :create_notification而不是after_create :create_notification和也likes: likes,添加行notifications.create(。保存因为在评论控制器工作得更好之后

我有这样的:

def like 
    @comment_like = current_user.comment_likes.build(comment: @comment) 
    if @comment_like.save 
     @comment.increment!(:likes) 
     flash[:success] = 'Thanks for liking!' 
    else 
     flash[:error] = 'Too many likes' 
    end 
    redirect_to(:back) 
    end 
0

原谅我,因为我不真的不知道习惯,量化等等是什么,但是你的代码使它看起来像他们一样ngs可以被评论,因此你应该使用多态关联。

class Comment < ActiveRecord::Base 
    belongs_to :commentable, polymorphic: true 
    has_many :notifications 
    after_create :notify_user 

    def notify_user 
    self.notifications.create user: commentable.user 
    end 
end 

class Habit < ActiveRecord::Base 
    has_many :comments, as: :commentable 
end 

class Notification < ActiveRecord::Base 
    belongs_to :comment 
    belongs_to :user 
    delegate :commentable, to: :comment 
end 

在这里,通过使用多态关系,我们简化了一切。另外,您还可以使用多态路径佣工

<%= link_to "your comment", polymorphic_url(notification, commentable) %> 

希望这可以帮助你指出正确的方向

+0

对不起,这不完全回答这个问题。评论是多态的。这更多关于CommentLikes通过使用polyphorphic注释找出评价,习惯,目标或量化的评论id的ID –

+0

这将有助于看到您的评论,如模型 – DVG

+0

对不起DVG我添加了上面的完整模型:) –

相关问题