0

この SQL ステートメントを「Rails 方式」で記述するにはどうすればよいですか?

SELECT users.*, count(invitations.id) AS invitations_count 
FROM users
LEFT OUTER JOIN invitations ON invitations.sender_id = users.id
GROUP BY users.id
HAVING count(invitations.sender_id) < 5 AND users.email_address NOTNULL
ORDER BY invitations_count

この種のクエリには squeel gem を使用する必要がありますか?

4

2 に答える 2

1

これは、SQL を転送するだけの場合に利用できます。

User.find_by_sql("...")

ただし、名前付け (invitations.user_id) で Rails の規則に従い、毎回参加して取得するのではなく、ユーザーの招待カウントを保存する (招待を追加するときに更新する) 場合は、次のようにすることができます。

ユーザーについて:

scope :emailable, where('users.email_address IS NOT NULL')
scope :low_invitations, where('users.invitation_count < 5')

次に、5 人未満の招待と電子メール アドレスを持つユーザーを、招待の数で並べ替えてクエリするには、次のようにします。

@users = User.emailable.low_invitations.order('invitation_count asc')

次に、次のような方法でユーザーの招待にアクセスします。

@user.invitations
@user.invitations.count 
etc

上記の場合、invitation_count 列をユーザーに追加し、sender_id を user_id に変更し、いくつかのスコープをユーザー モデルに追加する必要があります。また、invitation_count を非正規化せずに結合を使用してカウントを取得することもできます。

Rails を使用する場合は、これらの規則に反対するよりも、これらの規則に従う方がはるかに簡単です。小さな実験的なアプリをセットアップしてリレーションで遊んだり、関連ガイドを読んだりする価値があると思われるかもしれません。

http://guides.rubyonrails.org/association_basics.html

于 2012-10-26T18:10:49.873 に答える
0

招待状とユーザーの適切なモデルを定義してから、n*1またはn*nの関係(belongs_to、has_manyなど)を介してそれらを接続する必要があります。そうすれば、このクエリまたは同様のクエリを「内部で」生成するコードを記述できるようになります。

Railsを使用するときは、SQLについて考えるのをやめ、モデル、ビュー、コントローラーについて考え始める必要があります。

于 2012-10-26T18:01:25.553 に答える