Ruby on rails 在RubyonRails中从三种不同的模型订购数据

Ruby on rails 在RubyonRails中从三种不同的模型订购数据,ruby-on-rails,activerecord,join,Ruby On Rails,Activerecord,Join,我有三种型号,即图像、数据文件和视频。我想让用户从这三种模型中获取最新的内容 这样做的一个非常糟糕的地方可能是: images = User.find(8).images videos = User.find(8).videos data_files = User.find(8).data_files 所有内容: all_content = images + videos + data_files all_content.sort_by(&:created_at).re

我有三种型号,即图像、数据文件和视频。我想让用户从这三种模型中获取最新的内容

这样做的一个非常糟糕的地方可能是:

  images = User.find(8).images
  videos = User.find(8).videos
  data_files = User.find(8).data_files
所有内容:

 all_content = images + videos + data_files
 all_content.sort_by(&:created_at).reverse.paginate(:page => params[:page],:per_page=> per_page)

如何在一个查询中做到这一点以使代码更好。

在用户模型中,您可以这样做:

def resources
  (images + videos + data_files).sort_by(&:created_at).reverse
end
然后打电话

User.find(8).resources.paginate(:page => params[:page],:per_page=> per_page)

也许有一个
内容
模型将用户与其内容连接起来是个好主意。大概是这样的:

class User < ActiveRecord::Base
  has_many :contents
end

class Content < ActiveRecord::Base
  belongs_to :user
  # Remember the contentable_type and contentable_id columns
  belongs_to :contentable, :polymorphic => true
end

# Similar relations for Image/File models
class Video < ActiveRecord::Base
  has_one :content, :as => :contentable
  belongs_to :user, :through => :content
end

# Then to fetch the last contents from the user
Content.where(:user_id => 8).order('created_at DESC')
       .paginate(:page => params[:page], :per_page=> per_page)
在这种情况下,如果您想要所有用户的内容,您可以使用
user.contents
,并根据其类型获得特定对象(视频、图像等)的数组。 您也可以通过类似于此的
视频获取图像或视频。所有


当然,这些只是想法,真正的实现取决于您的问题和需求。

它会先获取所有记录,然后再执行操作吗?我想是吗?你说呢?是的,它先获取所有记录,然后对它们进行排序。这是一种糟糕的方法。假设一个用户有大量的数据,这将花费很多时间。我认为你需要准确地解释你在这里要做什么。如果您想获取模型的“最新”条目,可以执行类似images=images.where(“user_id=?and created_at>?”,user.find(8.id,5.days.ago)的操作。我有三个模型,我想从所有三个模型中获取最新的12个条目。12从3开始,而不是12+12+12从每个开始。它可以是3张图片、2个数据文件或7个视频,或者根据用户的活动和上传的内容进行组合。image.where(“user_id=?”,8).paginate。。。。。会给我图像吗?现在我想做的是相同的查询,但在三个模型中得到输出。嘿,我明白了,你说的是多态关系。我不能使用它,因为我的模型没有公共数据列。但是,我仍然可以只存储ID来获取多态内容。我展示的第一个解决方案不需要模型之间的太多公共数据,您只需将特定模型(例如视频)的引用存储在基本模型(内容)中,这样您就可以获取查询
contents
表的所有内容。
# The contents table has a type string column and
# all the specific models's columns
class Content < ActiveRecord::Base
end

# Video class inherit from Content (a Video is a Content!)
class Video < Content
end