我如何加入派生表?

时间:2011-12-06 16:20:11

标签: sql ruby-on-rails ruby-on-rails-3 postgresql ruby-on-rails-3.1

sql语句是这样的:

select posts.id, posts.title 
from posts 
inner join (select distinct post_id,created_at  
            from comments 
            order by created_at DESC limit 5
            ) as foo 
        on posts.id=foo.post_id 
order by foo.created_at DESC; 

我想得到一个相当于上面的rails 3 sql语句。

我尝试的内容如下:

以下sql查询给出了类似的结果。

select distinct post_id, created_at  
from comments 
order by created_at DESC limit 5

@temp = Comment.select('distinct(comments.post_id),created_at').order('created_at DESC').limit(5)

我尝试将这个派生的@temp表与posts表连接起来以获取posts.title

我尝试了但却失败了。

@temp2 = @temp.joins('posts')

那么,我如何使用派生的@temp表加入posts表?

                                   Table "public.posts"
   Column    |          Type          |                     Modifiers                      
-------------+------------------------+----------------------------------------------------
 id          | integer                | not null default nextval('posts_id_seq'::regclass)
 title       | character varying(100) | not null
 content     | character varying(500) | not null
 created_at  | date                   | 
 updated_at  | date                   | 
 tags        | character varying(55)  | not null default '50'::character varying
 category_id | integer                | not null default 1
Indexes:
    "posts_pkey" PRIMARY KEY, btree (id)

评论

                                   Table "public.comments"
   Column   |          Type          |                       Modifiers                       
------------+------------------------+-------------------------------------------------------
 id         | integer                | not null default nextval('comments_id_seq'::regclass)
 post_id    | integer                | not null
 name       | character varying(255) | not null
 email      | character varying(255) | not null
 content    | character varying(500) | not null
 created_at | date                   | 
 updated_at | date                   | 
Indexes:
    "comments_pkey" PRIMARY KEY, btree (id)

发布模型,has_many :comments,评论模型,belongs_to :post

1 个答案:

答案 0 :(得分:1)

问题作者需要在跳转到SQL之前阅读基本的Rails和activerecord用法。需要了解Activerecord如何为您的数据建模以及如何使用它。首先弄清楚你想用通用语言做什么,然后看看你如何使用现有的语言来做。

Rails不知道你的@temp表的结构。它只有一个结果集,根据我的理解,AREL不会从结果集中构建逻辑。它从模式构建,它为活跃的记录模型提供了支持。

您无法从此数据构建视图,因此您唯一的选择是使用带有activerecord类的标准连接选项或执行自定义SQL。

在Rails 3中,ActiveRecord关系代数非常先进,使查询变得非常简单。

Comment.order("#{Comment.table_name}.created_at desc').limit(5).joins(:posts).order("#{Post.table_name} created_at desc")