我更新了这个问题,因为我将以下位置和用户合并为一个多态模型。
所以我正在尝试在我的应用中制作评论的新闻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语句可能有所帮助。
答案 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)
随着这变得越来越复杂,它将变得更加复杂,请研究范围和合并。可能会将此方法拉出到某个搜索类中。