如何将模型与模型中的模型相关联?

时间:2015-06-13 23:42:45

标签: ruby-on-rails ruby model-view-controller notifications conditional-statements

当用户喜欢在 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: 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

如果您需要进一步的解释或代码,请与我们联系: - ]

2 个答案:

答案 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