1

可能性の重複:
Ruby on Rails: How can i join with a derived table?これに相当するレール3のSQL文を誰でも投稿できますか?

ポストテーブル

        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) 

私が作るしようとしていますこれに相当する3つの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; 

最新のコメント(投稿数:5)を取得します。これは複雑なSQLクエリです。投稿テーブルのコメントテーブルへの投稿からposts.titleを選択する必要があります。物事を難読化でしょう

posts = Post.find_by_sql(%q{ 
    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 
}) 

あなたが欲しかったけど、私見場合はjoinsを使用することができ、::

+1

'find_by_sql'の何が問題なのですか? –

+0

私はfind_by_sqlの作品を知っていますが、私は複雑なSQLクエリのためのレール3 SQL文を探しています。 – shibly

答えて

1

そのようなクエリを実行するRails3の方法がfind_by_sqlある

Post.select('posts.id, posts.title'). 
    joins('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('foo.created_at desc') 

それとも何かさらに、このような複雑な:いくつかのものは、アーカンソー

join_to = Comment.select('distinct post_id, created_at'). 
        order('created_at desc'). 
        limit(5). 
        to_sql 

posts = Post.select('posts.id, posts.title'). 
      joins("join (#{join_to}) as foo on posts.id = foo.post_id"). 
      order('foo.created_at desc') 

ARELよりもSQLでもっと簡単で明快です。 find_by_sql methodは理由が存在する:

find_by_sqlがデータベースにカスタム呼び出しを行うと、インスタンス化されたオブジェクトを取得する簡単な方法を提供します。

この種のものはまさにfind_by_sqlのためです。高度なSQL機能(CTEなど)がたくさんある場合は、find_by_sqlを抜き出す必要があります。ActiveRecordは独断的な方法ではなく、恐れたり、避けたりする必要はありません。 find_by_sqlには、(スコープでうまく演奏していないなどの)欠点がありますが、標準的なARELのようなものもあります(単純なSQLでうまく演奏しないなど)。

+0

'Posts.select( 'posts.id、posts.title')。 join( 'posts.id = foo.post_id'にfooとしてjoin(別のpost_id、...を選択))。 order( 'foo.created_at desc') '、Post.selectになり、この行を完成させてください。' select distinct post_id、... ' – shibly

+0

@guru:誤植を見つけてくれてありがとう。私は楕円がはっきりしていると思ったが、混乱を避けるためにそれらを置き換えた。 –

+0

感謝ムーが短すぎます。 – shibly

関連する問題