2

それで、私はこの「高度な」クエリを (それほど多くはありませんが) 持っており、それを Ruby Active Record の構文に変換したいと考えています。

SELECT microposts.* 
FROM microposts
WHERE user_id IN 
      ( SELECT r.followed_id as uid 
        FROM relationships r 
        WHERE follower_id = 1 
      UNION 
        SELECT u.id as uid 
        FROM users as u 
        WHERE id = 1
      ) 
ORDER BY microposts.created_at DESC

アイデアは、ユーザー 1 のすべてのマイクロポストを取得し、ユーザー 1 が作成順にユーザーをフォローすることでしたが、Active Record の構文を使用してこれを簡単に変換する方法が本当にわかりません。

何か考えはありますか?

PS:ここで尋ねられたように、いくつかのレールのコンテキストがあります:

MicropostsUsers、 の3 つのモデルがありRelationshipsます。

  • Relationships は、すべてのユーザーの関係 (フォロワー/フォロー対象) を処理する結合テーブルです。
  • ユーザーは、関係を通じて多くの follow_users/followers を持っています。
  • ユーザーには多数のマイクロフープがあり、マイクロフープには 1 人のユーザーがいます。

ありがとう。

4

4 に答える 4

0

where のみを使用してなんとかそれを行うことができましたが、私には find_by_sql によく似ているようで、どちらが優れているかわかりません。

Micropost.order('created_at DESC').
where('user_id in (select r.followed_id as uid from relationships as r where follower_id = ?) or user_id = ?', user.id, user.id)

これがどれほど良いかはわかりませんが、機能しているようです。

于 2012-08-06T14:52:15.327 に答える