如何在此代码中创建一个急切的加载多态关联?

时间:2017-03-09 20:43:48

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

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日期排序。

如何实现这一目标?

1 个答案:

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

然后,您可以将其用作查询的只读记录集。