在一个结果集中Rails多个关联

时间:2015-02-24 20:05:07

标签: ruby-on-rails

我有一个has_many :commentshas_many :reviews的视频模型。

我想构建一个API,允许返回混合类型和按创建时间排序的两种关联类型。

换句话说,有没有办法(没有效率低或不高兴)我可以致电video.feedback并找回评论和评论的混合列表?

我也喜欢视频控制器'索引操作返回一个视频列表,每个视频都有自己的前三个最新反馈(可能是评论,可能是评论,可能是两者的混合,具体取决于它们的创建时间)

1 个答案:

答案 0 :(得分:2)

您可以在模型中创建一个连接两个关联的方法,然后对它们进行排序。例如:

def feedback
  results = (comments + reviews).sort_by{ |e| e.created_at }
end

如果您有大量记录并希望稍微加快某个过程,则可以轻松限制返回的结果数量。请注意,您需要先单独订购每个关联,然后合并,然后再次排序。

def feedback max
  # We need to get `max` entries from each to ensure that we will have
  # enough entries in the final result.
  results = comments.order(:created_at).limit(max) + reviews.order(:created_at).limit(max)

  # Then, we only return the first `max` entries of the result, since there
  # will be `2*max` entries in `results`.
  results.sort_by{ |e| e.created_at }.first(max)
end

这导致了你问题的第二部分。


如果您只想查看视图中提供的最新反馈,那么您实际上并不需要更改控制器操作。相反,您可以直接在视图中访问它们。

假设您将视频列表保留在变量@videos中,这可能看起来像(省略您可能正在使用的任何ERB / Haml):

@videos.each do |video|
  video.feedback(3).each do |fb|
    # do whatever with each feedback item here
  end
end

如果您需要区分反馈类型,可以使用case...when块:

case fb
when Comment
  # The feedback is a comment
when Review
  # The feedback is a review
end