0

私は、次のクエリと、アクティブ レコードを使用してそれを実行する方法について、頭を悩ませてきました。

select * from links where id in 
    (select id from 
        (select votable_id as id, count(votable_id) as count from votes where vote_scope = 'flag' and votable_type = 'Link' group by votable_id ) 
     as x where count < 3);

現在、ファインダーで生の SQL クエリのみを使用しています ( find_by_sql) が、これを行うためのより「レールらしい」方法があるかどうか疑問に思っていましたか?

編集

Joachim Isaksson のおかげで、クエリを押しつぶすことができます

select * from links where id in 
    (select votable_id from votes 
     where vote_scope = 'flag' 
     and votable_type = 'Link' 
     group by votable_id 
     HAVING COUNT(*) < 3) ;
4

1 に答える 1

1

まず、私が Rails の第一人者ではないことから始めましょう。これをテスト実行することはできないため、少し「盲目的に実行」しています。言い換えれば、これを一粒の塩で取ってください:)

クエリを結合として書き直します (ここでは、リンク テーブルに;のためにid呼び出されるもう 1 つのフィールドがあると仮定します)。linkGROUP BY

SELECT links.* 
FROM links
JOIN votes
  ON links.id = votes.votable_id
 AND votes.vote_scope = 'flag'
 AND votes.votable_type = 'Link'
GROUP BY votes.votable_id, links.id, links.link
HAVING COUNT(*) < 3;

(テストする SQLfiddle)

...このようなものを作成する必要があります(読みやすくするために行を分割します)

Link.joins("JOIN votes ON links.id = votes.votable_id
            AND votes.vote_scope = 'flag' AND votes.votable_type = 'Link'")
    .group("votes.votable_id, links.id, links.link")
    .having("COUNT(*) < 3")

アソシエーションを正しく設定すると、より "railsy" な方法でも参加できるようになります。

于 2013-05-25T11:14:25.043 に答える