Rails新闻提要评论

时间:2014-10-14 19:55:24

标签: sql ruby-on-rails ruby activerecord ruby-on-rails-4

我更新了这个问题,因为我将以下位置和用户合并为一个多态模型。

所以我正在尝试在我的应用中制作评论的新闻Feed。

我有一个用户模型,一个关注以下位置和用户的模型。然后我有一个评论模型。

如何从用户关注的用户处获取评论,并从用户关注的位置获取评论并将其放在一起?

我需要对它进行分页,并按created_at时间戳排序(最新显示)。

继承我的迁移是什么样的

create_table :comments do |t|
  t.text :text
  t.integer :user_id
  t.integer :commentable_id
  t.string :commentable_type

create_table :follows do |t|
  t.integer :user_id
  t.integer :followable_id
  t.string :followable_type

这就是我的模型的样子

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

class Comment < ActiveRecord::Base
    belongs_to :commentable, polymorphic: true
end

更新: 我在sql中找到了一个叫做CASE语句的东西(比如if语句)How do I perform an IF...THEN in an SQL SELECT?

我仍然不确定如何编写此查询,但我认为CASE语句可能有所帮助。

1 个答案:

答案 0 :(得分:0)

如果我正确地收集你的问题,你可能会看到这样的模型:

class User < ActiveRecord::Base

  has_many :comments, as: :commentable, dependent: :nullify

  has_many :follows, dependent: :destroy
  has_many :followed_users, class_name: 'Follow', conditions: {followable_type: 'User'}
  has_many :followed_locations, class_name: 'Follow', conditions: {followable_type: 'Location'}

  has_many :followers, as: :followable, dependent: :destroy

end

在您的控制器中,您可能会看到类似这样的内容:

# See all comments made by those you follow (and yourself)
# See all comments made on locations you follow
# See all comments made on users you follow
@comments = Comment.where(
  'user_id in (:followed_user_ids) or (commentable_type = 'Location' and commentable_id in (:followed_location_ids)) or (commentable_type = 'User' and commentable_id in (:followed_user_ids))',
  { 
    followed_user_ids: current_user.followed_users.pluck(:user_id) | [current_user.id], 
    followed_location_ids: current_user.followed_locations.pluck(:location_id)
  }
).paginate(page: params[:page]).order(created_at: :desc)

随着这变得越来越复杂,它将变得更加复杂,请研究范围和合并。可能会将此方法拉出到某个搜索类中。