如何将一堆ActiveRecord关系映射到单个ActiveRecord :: Relation对象中

时间:2013-09-26 22:37:25

标签: ruby-on-rails ruby activerecord

基本上,我想采用一组典型的ActiveRecord关系,使其看起来像一个更简单的关系。

假设我有一个典型的PostCommentUser,其中一篇帖子有很多评论和评论都有用户。

现在,假设我想将以下数据放入视图中。 (假设所有需要的数据都可以通过单个Arel语句读取)。

post.title
post.tag.name
post.comments.last
post.comments.last.user.full_name

我想通过以下方法通过名为PostSummary的新对象访问它们:

post_summary.title
post_summary.tag_name
post_summary.last_comment
post_summary.last_comment_user

到目前为止,并不太棘手。它可以通过OpenStruct和一些映射完成,但我希望PostSummary是一个只读的ActiveRecord :: Relation对象,它允许你执行以下操作:

PostSummary.first.attributes #=> [title, tag_name, last_comment, last_comment_user]
PostSummary.count #=> 42
...

我确信通过大量工作可以实现这一点,但是有没有设置过这样做?

1 个答案:

答案 0 :(得分:2)

看起来有点凌乱做你的建议。我建议在装饰器中删除这些方法。装饰器通常用于保存与视图相关的信息和方法,以避免模型膨胀。

对于一个好的装饰库,请参阅Draper