我有一个has_many :comments
和has_many :reviews
的视频模型。
我想构建一个API,允许返回混合类型和按创建时间排序的两种关联类型。
换句话说,有没有办法(没有效率低或不高兴)我可以致电video.feedback
并找回评论和评论的混合列表?
我也喜欢视频控制器'索引操作返回一个视频列表,每个视频都有自己的前三个最新反馈(可能是评论,可能是评论,可能是两者的混合,具体取决于它们的创建时间)
答案 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