如何创建急切的加载多态性关联,以实现此代码



rails:包括多态关联

组合2个对象和排序轨道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日期进行排序。

我该如何实现这一目标?

通常要这样做,您将拥有从单个基类继承的两个类,例如:

class Media < ActiveRecord::Base
end
class Video < Media
end
class Audo < Media
end

,将有一个名为medias的基础表。参见http://guides.rubyonrails.org/association_basics.html#polymorphic-sassociations

如果您被两个单独的表扎了,那么一个解决方案是创建一个视图,例如,如果您使用的是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;

然后在此基础上创建一个"假"模型:

class Media < ActiveRecord::Base
end

然后,您可以将其用作仅阅读记录,以查询。

最新更新