Rails: includes with polymorphic association
combine 2 objects and sort rails 5
这是我目前的代码:
user.rb
def photo_feed
following_ids = "SELECT followed_id FROM relationships
WHERE follower_id = :user_id"
Photo.approved.where("user_id IN (#{following_ids})", user_id: id)
end
def video_feed
following_ids = "SELECT followed_id FROM relationships
WHERE follower_id = :user_id"
Video.approved.where("user_id IN (#{following_ids})", user_id: id)
end
UsersController
def feed
@user_feed_photo_items = current_user.photo_feed.order('created_at desc').paginate(page: params[:page], per_page: 15)
@user_feed_video_items = current_user.video_feed.order('created_at desc').paginate(page: params[:page], per_page: 15)
end
用户关注上传照片和视频的其他用户。我的目标是停止分离照片和视频,而是以created_at
排序的上述答案中所述的多态关联方式显示照片和视频。
但我上面提到的答案要简单得多。创建新对象时,它只会添加到时间轴中。在我的情况下,在用户跟随另一个用户之前,对象不会被添加到时间线中,并且当取消关注时,他们将需要从时间线中删除。而且他们仍然需要按时间轴内的created_at
日期排序。
如何实现这一目标?
答案 0 :(得分:0)
通常,要执行此操作,您将拥有从单个基类继承的两个类,例如:
class Media < ActiveRecord::Base
end
class Video < Media
end
class Audo < Media
end
并且会有一个名为medias
的基础表。见http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
如果您遇到两个单独的表,那么一个解决方案是创建一个视图,例如,如果您使用的是Postgres,那么就是这样:
CREATE OR REPLACE VIEW media AS
SELECT id, 'Video' as type, a,b,c FROM videos
UNION
SELECT id, 'Audio' as type, a,b,c FROM audios;
然后创建一个假冒的&#39;最重要的模型:
class Media < ActiveRecord::Base
end
然后,您可以将其用作查询的只读记录集。