当用户喜欢在 commet_like.rb 中触发评论create_notification
时:
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 %>
但问题是这些条件中的每一个条件都没有为comment_like,因此通知显示为空白。
正如你在这里看到的,虽然CommentLike与Comment相关联,在此示例中,comment_id: 1
和comment_id: 1
有valuation_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 :(得分:0)
请原谅我,因为我不知道习惯,量化等等,但是你的代码看起来好像是可以评论的东西,所以看起来你应该使用多态关联。 / p>
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) %>
希望这有助于指明你正确的方向
答案 1 :(得分: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